【发布时间】:2014-04-25 07:17:31
【问题描述】:
我正在使用 SAX 解析器构建 XML DOM 文档。我已经编写了处理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 文件中永远不会出现 <![CDATA[ 标记,而是将所有备份转义为 &gt; 和 &lt;,这对于其他工具来说没问题,但对于需要阅读文件也是如此。我很肯定“con:setting”标签是正确的。那么命名空间前缀可能有问题吗?
另外this question 表示不能省略 CDATA_SECTION_ELEMENTS 属性,并且通常在不转义数据的情况下序列化所有 CDATA 节点。该信息是否正确,或者答案作者可能不知道其他方法?
更新:看来我的代码有误。当使用 document.createCDATASection() 函数,然后使用 Transformer 序列化代码时,它DOES 输出 CDATA 标记,即使没有在转换器中使用 CDATA_SECTION_ELEMENTS 属性。
【问题讨论】:
-
您不能使用运行 XSLT 样式表的 Transformer 从输入中保留 CDATA,也许对于无操作转换器的规则不同(或者更可能结果将是特定于处理器的)。
-
我现在在保存的 XML 文件中获取 CDATA 标记时它们似乎是这样的。
-
看看你是否在不同的
TransformerFactory实现中得到相同的行为会很有趣——例如,如果你切换到 Saxon,no-op Transformer 是否仍然保留 CDATA?我在 JAXP 规范中看不到任何定义它的任何内容,但我知道 DOM LS 机制肯定会在所有情况下按照您的要求工作。