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

如何在Java中使用XPath作为节点访问CDATA?,java,xpath,cdata,Java,Xpath,Cdata,在以下XML上使用在线XPath tester <a>foo <![CDATA[ MyCData]]> baz</a> (这是由三个节点构成的,我们可以使用/a/text()[2],返回baz) 但是,对于javax.xml.xpath.xpath,根本不会返回CData和最后一个文本节点。我得到一个带有foo的单一节点,而baz文本的其余部分就是不可用。不管XPath如何处理XML结构,如果我们根本无法访问节点,那就是一个错误 但是,如果我在Do

在以下XML上使用在线XPath tester

<a>foo <![CDATA[ MyCData]]>  baz</a>    
(这是由三个节点构成的,我们可以使用
/a/text()[2]
,返回
baz

但是,对于javax.xml.xpath.xpath,根本不会返回CData和最后一个文本节点。我得到一个带有
foo
的单一节点,而
baz
文本的其余部分就是不可用。不管XPath如何处理XML结构,如果我们根本无法访问节点,那就是一个错误

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

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


当我检查我的DOM文档的完整DOM树时,默认情况下使用isCoalScing,我发现CData节被表示为它自己的CData节类型的节点,这很好,但是我如何在XPath中访问这个节点呢?

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


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

这可能会有所帮助:谢谢,但这涉及到CDATA中的XML。我只想要CData!在其他XPath引擎中,CData只是一个文本节点,但在Java中不是这样。好的,如果Java XPath返回一个节点foo MyCData baz,那就太好了。但事实上,它只返回一个节点foo,没有其他节点。但是当合并为false时,JavaXPath引擎会做什么呢?它似乎没有生成替代结构,而只是“放弃”了除第一个节点之外的所有文本。试试看。(更好的是,不要使用DOM:切换到更好的树模型,如JDOM或XOM)。“…无论DOM是否合并”:我宁愿不将CData转换为输出中的转义文本,因为它看起来很难看,即使它是标准的。此外,我更希望能够将CData作为某种节点单独寻址,无论是XPath规范中的文本节点,还是特殊类型的节点。事实上,你更希望它说些别的话,这与你的想法并不相关。
foo <![CDATA[ MyCData]]>  baz