2014-04-25 68 views
2

我正在用SAX解析器构建XML DOM文档。我写的方法来处理startCDATAendCDATA方法,并在endCDATA方法我建立一个新的CDATA节是这样的:将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); 
} 

当我序列化这对我使用下面的行来配置变压器的XML文件:

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

从来没有<![CDATA[标记出现在我的XML文件,而不是所有backets都逃到&gt;&lt;越少,这是其它工具没有问题,但它是谁需要读取该文件作为人类的一个问题好。我确信“con:setting”标签是正确的。那么命名空间前缀可能有问题吗?

另外this question表示无法省略CDATA_SECTION_ELEMENTS属性,并且通常在不转义数据的情况下序列化所有CDATA节点。这些信息是否正确?答案的作者是否还可能知道其他方法?

更新:看来我的代码有错误。当使用document.createCDATASection()功能,然后使用变压器串行化代码时,即使不使用变压器中的CDATA_SECTION_ELEMENTS属性,它也会输出CDATA变量。

+0

您不能使用运行XSLT样式表的Transformer保存CDATA,也许规则对于无操作变换器(或更可能的结果将是处理器特定的)可能不同。 –

+0

看来他们是因为我现在在保存的XML文件中获得了CDATA标签。 – lanoxx

+0

如果您在不同的'TransformerFactory'实现中获得相同的行为会很有趣 - 例如,如果切换到Saxon,那么无操作的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"); 

尝试使用适当的命名空间"{http://con.namespace/}setting"

更换"con:setting"

0

而不是使用一个空操作Transformer序列化的DOM树,你可以尝试使用DOM -native "load and save" mechanism,它应该保留DOM树中的CDATASection节点,并将它们作为CDATA节写入生成的XML中。

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); 
}