ChatGPT解决这个技术问题 Extra ChatGPT

XPath:选择文本节点

具有以下 XML:

<node>Text1<subnode/>text2</node>

如何通过 XPath 选择第一个或第二个文本节点?

像这样的东西:

/node/text()[2]

当然不起作用,因为它是节点内每个文本的合并结果。

您写道: /node/text()[2] [...] 不起作用,因为它是节点内每个文本的合并结果 这是错误的:它意味着 node 根的第二个文本节点子节点元素字符串值(后代文本节点的串联)将是 string(/node)
您的意思是 Xpath 查询应该可以工作?好吧,我想我在其他地方还有另一个问题。 ;) 谢谢!

D
Dimitre Novatchev

具有以下 XML: Text1text2 如何通过 XPath 选择第一个或第二个文本节点?

利用:

/node/text()

这将选择 XML 文档的顶部元素(名为“节点”)的所有文本节点子节点。

/node/text()[1]

这将选择 XML 文档的顶部元素(名为“节点”)的第一个文本节点子节点。

/node/text()[2]

这将选择 XML 文档顶部元素(名为“节点”)的第二个文本节点子节点。

/node/text()[someInteger]

这将选择 XML 文档的顶部元素(名为“节点”)的第 someInteger 文本节点子节点。它等价于以下 XPath 表达式:

/node/text()[position() = someInteger]

这在 PHP 中有效吗?我试图只遍历文本节点,即使是一组标签之间的节点。问题在于将多个文本节点的内容粉碎在一起,而不管标签如何。仍然使用 //*[text()]/html/text() 不起作用。
@AaronGillion,是的,AFAIK PHP 具有正确工作的 XPath 1.0 评估。请注意,/html/text() 不会选择文档中的所有文本节点,只选择顶部 html 元素的子节点(不是后代)的文本节点。您可能想要 /html//text() 。为了构建 XPath 表达式,通常需要一些 XPath 知识和理解。
谢谢。我之前想出了双斜线的把戏!
@AaronGillion,不客气。您可以在此在线培训课程的模块 2 中学习 XPath 1.0 和 2.0 的基础知识:pluralsight.com/courses/xslt-foundations-part1
h
hakre

你的 xpath 应该可以工作。我已经在 MarkLogic 和 Zorba Xquery/Xpath 实现中测试了你的 xpath 和我的 xpath。

两者都应该工作。

/node/child::text()[1] - should return Text1
/node/child::text()[2] - should return text2


/node/text()[1] - should return Text1
/node/text()[2] - should return text2