【发布时间】:2012-08-22 07:07:44
【问题描述】:
在以下 XML 上使用 this 在线 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 结构,如果我们根本无法访问节点就是一个 bug。
但是,如果我在 DocumentBuilderFactory 上设置 isCoalescing(true),它会将所有文本和 CData 节点连接为一个。我可能最终会使用它,但它会将 CData 转换为输出中的转义文本,这看起来很难看,即使标准允许它也是如此。此外,我希望能够将 CData 单独作为某种节点来处理,无论是“只是”一个文本节点,还是某种特殊类型的 CData 节点。
顺便说一下,如果 CData 是其父元素的 only 内容,前面没有空格或其他文本,普通的 text-content XPath 可以成功检索它,即使使用 isCoalescing 在其默认值 (false)。因此,我们看到 Java XPath 总是返回第一个,并且只返回第一个文本节点。
当我检查我的 DOM 文档的完整 DOM 树时,默认使用 isCoalescing,我发现 CData 部分表示为它自己的 cdata-section 类型节点em>,很好,但是如何在 XPath 中访问这个节点?
【问题讨论】:
-
谢谢,但那是关于 XML inside CData。我只想要CData!在其他 XPath 引擎中,CData 只是一个文本节点,但在 Java 中不是,如上所述。