Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将JavaDOM文档序列化为XML:添加CData元素_Java_Xml_Dom_Sax - Fatal编程技术网

将JavaDOM文档序列化为XML:添加CData元素

将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.

我正在用SAX解析器构建一个XMLDOM文档。我编写了处理
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-op
Transformer
,您可以尝试使用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机制在所有情况下都会按照您的要求工作。