2014-04-25 6 views
2

SAX 파서로 XML DOM 문서를 생성 중입니다. 나는 startCDATAendCDATA 방법을 처리하는 방법을 쓴하고 endCDATA 방법이 같은 새로운 CDATA 섹션 구성 : 내가 변압기를 구성하려면 다음 줄을 사용하는 XML 파일이 직렬화 할 때Java DOM 문서를 XML로 직렬화하기 : CData 요소 추가하기

public void onEndCData() { 
    xmlStructure.cData = false; 
    Document document = xmlStructure.xmlResult.document; 
    Element element = (Element) xmlStructure.xmlResult.stack.peek(); 
    CDATASection section = document.createCDATASection(xmlStructure.stack.peek().characters); 
    element.appendChild(section); 
} 

를 :

transformer.setOutputProperty(OutputKeys.CDATA_SECTION_ELEMENTS, "con:setting"); 

이 다른 도구에 대한 문제가 더 <![CDATA[ 태그 내 XML 파일에 나타나지 않는 대신 모든, 집합이 &gt;&lt;으로 탈출하는 작은 절대로하지만로 파일을 읽을 필요가 인간에 대한 문제가 잘. 나는 "con : setting"태그가 올바른 것이라고 긍정적이다. 네임 스페이스 접두어에 문제가 있습니까?

또한 this question은 CDATA_SECTION_ELEMENTS 속성을 생략 할 수 없으며 일반적으로 데이터를 이스케이프 처리하지 않고 모든 CDATA 노드를 직렬화 함을 나타냅니다. 그 정보가 맞습니까? 아니면 대답의 저자가 알지 못했던 다른 방법이 있습니까?

업데이트 : 내 코드에 실수가있는 것 같습니다. document.createCDATASection() 함수를 사용할 때 변압기에 CDATA_SECTION_ELEMENTS 속성을 사용하지 않아도 변압기로 코드를 DOES으로 출력하면 CDATA 태그가 출력됩니다.

+0

당신은 XSLT 스타일 시트를 실행하는 변압기로 입력에서 CDATA를 보존 할 수없는, 어쩌면 규칙 (가능성이 결과는 프로세서 고유의 것 또는) 노 연산 변압기 다릅니다. –

+0

저장된 XML 파일에 CDATA 태그가 추가 된 것 같습니다. – lanoxx

+0

다른 TransformerFactory 구현으로 동일한 동작을하는지 보는 것이 흥미로울 것입니다. 예를 들어 Saxon으로 전환하면 no-op Transformer는 여전히 CDATA를 보존합니까? 어느 쪽이든 그것을 정의하는 JAXP 스펙에서는 아무것도 볼 수 없지만 DOM LS 메커니즘이 모든 경우에 꼭 필요한대로 작동한다는 것을 알고 있습니다. –

답변

2

네임 스페이스 인식 DOM이있는 것 같습니다. docs는 요소의 Qualified Name Representation를 제공하기 위해 필요하다고 :

private static String qualifiedNameRepresentation(Element e) { 
    String ns = e.getNamespaceURI(); 
    String local = e.getLocalName(); 
    return (ns == null) ? local : '{' + ns + '}' + local; 
} 

그래서 속성 값의 형식은 {http://your.conn.namespace}setting이 될 것입니다. 이 라인에서

1

transformer.setOutputProperty(OutputKeys.CDATA_SECTION_ELEMENTS, "con:setting"); 

시도 당신은 DOM을 사용하여 시도 할 수 귀하의 DOM 트리를 직렬화하기 위해 어떤 조합 Transformer을 사용하지의

0

대신 적절한 네임 스페이스를 사용 "{http://con.namespace/}setting"

"con:setting" 교체 - 네이티브 "load and save" mechanism, DOM 트리에서 CDATASection 노드를 보존하고 결과 XML에 CDATA 섹션으로 써야합니다.

DOMImplementationLS ls = (DOMImplementationLS)document.getImplementation(); 
LSOutput output = ls.createLSOutput(); 
LSSerializer ser = ls.createLSSerializer(); 
try (FileOutputStream outStream = new FileOutputStream(...)) { 
    output.setByteStream(outStream); 
    output.setEncoding("UTF-8"); 
    ser.write(document, output); 
}