将JavaDOM文档序列化为XML:添加CData元素
我正在用SAX解析器构建一个XMLDOM文档。我编写了处理将JavaDOM文档序列化为XML:添加CData元素,java,xml,dom,sax,Java,Xml,Dom,Sax,我正在用SAX解析器构建一个XMLDOM文档。我编写了处理startCDATA和endCDATA方法的方法,在endCDATA方法中,我构建了一个新的CDATA部分,如下所示: public void onEndCData() { xmlStructure.cData = false; Document document = xmlStructure.xmlResult.document; Element element = (Element) xmlStructure.
startCDATA
和endCDATA
方法的方法,在endCDATA
方法中,我构建了一个新的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");
我的XML文件中出现的no标记从未减少过,而是将所有backet转义到
和
,这对于其他工具来说没有问题,但对于需要阅读该文件的人来说也是个问题。我确信“con:setting”标签是正确的。那么名称空间前缀可能有问题吗
还指示在不转义数据的情况下,不可能省略CDATA\u SECTION\u ELEMENTS属性并序列化所有CDATA节点。这些信息是正确的,还是有其他答案的作者不知道的方法
更新:我的代码似乎有错误。使用document.createCDATA SECTION()
函数,然后使用转换器序列化代码时,即使不使用转换器中的CDATA\u SECTION\u ELEMENTS
属性,它也会输出CDATA标记。看起来您有一个名称空间感知DOM。表示您需要提供元素的名称:
private static String qualifiedNameRepresentation(Element e) {
String ns = e.getNamespaceURI();
String local = e.getLocalName();
return (ns == null) ? local : '{' + ns + '}' + local;
}
因此,属性的值将采用{http://your.conn.namespace}在此行中设置
transformer.setOutputProperty(OutputKeys.CDATA_SECTION_ELEMENTS, "con:setting");
尝试用替换“con:setting”
{http://con.namespace/}设置“
使用适当的命名空间来序列化DOM树,而不是使用no-opTransformer
,您可以尝试使用DOM本机,它应该保留DOM树中的CDATA节
节点,并将它们作为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);
}
您不能使用运行XSLT样式表的转换器从输入中保留CDATA,可能是无操作转换器的规则不同(或者更可能是特定于处理器的结果)。现在,当我在保存的XML文件中获得CDATA标记时,它们似乎是一样的。如果您使用不同的TransformerFactory
实现,您是否会获得相同的行为,这会很有趣-例如,如果您切换到Saxon,无操作转换器是否仍保留CDATA?我在JAXP规范中看不到任何定义它的东西,但我知道domls机制在所有情况下都会按照您的要求工作。