gpt4 book ai didi

java - 如何在 Java 中使用 XPath 将 CDATA 作为节点访问?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:32:33 26 4
gpt4 key购买 nike

使用 this以下 XML 的在线 XPath 测试器

<a>foo <![CDATA[ MyCData]]>  baz</a>    

使用 XPath 表达式 /a/text() , 我取回所有文本

foo <![CDATA[ MyCData]]>  baz 

(它的结构为三个节点,正如我们可以看到使用 /a/text()[2] ,它返回 baz 。)

但是,对于javax.xml.xpath.XPath, CData 和最后一个文本节点根本 返回。我用 foo 得到一个节点,以及文本的其余部分 <![CDATA[ MyCData]]> baz只是不可用。无论 XPath 如何处理 XML 结构,如果我们根本无法访问节点,这就是一个错误。

但是,如果我在 DocumentBuilderFactory 上设置 isCoalescing(true),它会将所有文本和 CData 节点连接成一个。我可能最终会使用它,但它会将 CData 转换为输出中的转义文本,这看起来很难看,即使它是标准允许的。此外,我希望能够将 CData 作为某种节点单独寻址,无论是“只是”一个文本节点,还是某种特殊类型的 CData 节点。

顺便说一句,如果 CData 是其父元素的唯一内容,前面没有空格或其他文本,普通的文本内容 XPath 会成功检索它,即使 isCoalescing 为默认值(false)。因此,我们看到 Java XPath 始终返回第一个且仅返回第一个文本节点。

当我检查我的 DOM 文档的完整 DOM 树时,默认使用 isCoalescing,我发现 CData 部分表示为它自己的 cdata-section ,这很好,但是我如何在 XPath 中访问这个节点?

最佳答案

恐怕在线 XPath 测试器出错了。根据 XPath 数据模型,<a>元素有一个文本节点子节点,其字符串值为 "foo MyCDATA baz" ;没有第二个文本节点,因此对第二个文本节点的请求不应返回任何内容。

XPath 数据模型认为 CDATA 只是一种方便的数据输入方式,可以避免对特殊字符进行转义; CDATA 的存在不会影响 XML 的含义或信息内容,因此应用程序无法使用它。

关于java - 如何在 Java 中使用 XPath 将 CDATA 作为节点访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12148011/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com