Dom 使用Saxon的DocumentCreateCataSection方法的奇怪行为(Maven Saxon HE工件9.4)

Dom 使用Saxon的DocumentCreateCataSection方法的奇怪行为(Maven Saxon HE工件9.4),dom,cdata,saxon,xerces,Dom,Cdata,Saxon,Xerces,我尝试使用Saxon代替JDK的默认实现(我想是Xalan)进行XML转换和Xpath。在我的代码中,我使用document.createCDATA节(数据)方法创建了一个CDATA节点。代码如下所示: CDATASection cdata = doc.createCDATASection("data"); Node valueNode = node.appendChild(doc.createElement("value")); valueNode.appendChil

我尝试使用Saxon代替JDK的默认实现(我想是Xalan)进行XML转换和Xpath。在我的代码中,我使用document.createCDATA节(数据)方法创建了一个CDATA节点。代码如下所示:

    CDATASection cdata = doc.createCDATASection("data");
    Node valueNode = node.appendChild(doc.createElement("value"));
    valueNode.appendChild(cdata);
其中node是XML中的某个随机节点。 它与JDK的默认实现配合得很好,生成的XML如下所示:

            <node>
             <value><![CDATA[data]]></value>
            </node>

如果我包含Saxon maven工件(请注意,这只是包含,出厂选择/实例化是默认值,与前面一样),并且所有cdata节点都被视为简单文本节点,即XML变为:

            <node>
             <value>data</value>
            </node>

数据
这在检索时会引起问题,因为该代码专门检查cdata元素,在以后的情况下,这些元素已被删除。我不知道为什么会发生这种情况(看起来我没有正确使用它)。我还尝试从POM(Saxon的可传递依赖)中排除Xerces工件,但没有成功。此外,还验证了DocumentBuilderFactory等的实现类是从JDK本身使用的。如果我做错了什么,请专家们帮助我


提前感谢。

我想您的应用程序可能正在执行从DOMSource到StreamResult的JAXP标识转换,以便序列化DOM。JAXP标识转换的Saxon实现使用XSLT的序列化规则,这具有删除CDATA节的效果。这与JAXP完全一致,即使它不是默认JDK实现所做的

如果您依赖于JAXP身份转换器的特定实现的行为,那么您不应该编写应用程序来获取类路径上碰巧存在的任何实现;您应该显式地实例化所需的实现


当然,如果调用标识转换的代码不是您自己编写的,也不容易更改,那么这可能会很困难。在这种情况下,最好的方法是将系统属性javax.xml.transform.TransformerFactory设置为选择Xalan,并在其中调用Saxon,显式执行,而不是依赖JAXP工厂搜索。

我猜您的应用程序可能正在执行从DOMSource到StreamResult的JAXP标识转换,以便序列化DOM。JAXP标识转换的Saxon实现使用XSLT的序列化规则,这具有删除CDATA节的效果。这与JAXP完全一致,即使它不是默认JDK实现所做的

如果您依赖于JAXP身份转换器的特定实现的行为,那么您不应该编写应用程序来获取类路径上碰巧存在的任何实现;您应该显式地实例化所需的实现


当然,如果调用标识转换的代码不是您自己编写的,也不容易更改,那么这可能会很困难。在这种情况下,最好的方法是将系统属性javax.xml.transform.TransformerFactory设置为选择Xalan,在要调用Saxon的地方,显式地执行此操作,而不是依赖于JAXP工厂搜索。

谢谢Michael。用你的答案解决了这个问题。非常感谢,谢谢你,迈克尔。用你的答案解决了这个问题。非常感谢你。