【问题标题】:Strange behavior of Document createCDATASection method with Saxon (Maven Saxon-HE artifact 9.4)使用 Saxon 的 Document createCDATASection 方法的奇怪行为(Maven Saxon-HE 工件 9.4)
【发布时间】:2013-06-05 14:57:11
【问题描述】:

我尝试使用 Saxon 代替 JDK 的默认实现(我猜是 Xalan)来进行 XML 转换和 Xpath。在我的代码中,我正在使用 document.createCDATASection(data) 方法创建一个 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 工件,但没有运气。此外,验证了 JDK 本身正在使用 DocumentBuilderFactory 等的实现类。如果我做错了什么,请专家帮助我。

提前致谢。

【问题讨论】:

    标签: dom cdata saxon xerces


    【解决方案1】:

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

    如果您依赖于 JAXP 身份转换器的特定实现的行为,那么您不应该编写应用程序来获取恰好位于类路径中的任何实现;你应该明确地实例化你想要的实现。

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

    【讨论】:

    • 谢谢迈克尔。用你的答案解决了问题。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 2016-11-10
    相关资源
    最近更新 更多