我正在用SAX解析器构建XML DOM文档。我写的方法来处理startCDATA
和endCDATA
方法,并在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都逃到>
和<
越少,这是其它工具没有问题,但它是谁需要读取该文件作为人类的一个问题好。我确信“con:setting”标签是正确的。那么命名空间前缀可能有问题吗?
另外this question表示无法省略CDATA_SECTION_ELEMENTS属性,并且通常在不转义数据的情况下序列化所有CDATA节点。这些信息是否正确?答案的作者是否还可能知道其他方法?
更新:看来我的代码有错误。当使用document.createCDATASection()
功能,然后使用变压器串行化代码时,即使不使用变压器中的CDATA_SECTION_ELEMENTS
属性,它也会输出CDATA变量。
您不能使用运行XSLT样式表的Transformer保存CDATA,也许规则对于无操作变换器(或更可能的结果将是处理器特定的)可能不同。 –
看来他们是因为我现在在保存的XML文件中获得了CDATA标签。 – lanoxx
如果您在不同的'TransformerFactory'实现中获得相同的行为会很有趣 - 例如,如果切换到Saxon,那么无操作的Transformer是否仍然保留CDATA?我无法在JAXP规范中看到任何以任何方式定义它的东西,但我知道,在所有情况下,DOM LS机制肯定会正常工作。 –