XPath 搜索所有文本节点,而不是任何其他子节点的内部文本

Posted

技术标签:

【中文标题】XPath 搜索所有文本节点,而不是任何其他子节点的内部文本【英文标题】:XPath search for all text nodes, not the inner text of any other child node 【发布时间】:2011-08-29 23:38:06 【问题描述】:

我正在使用 htmlAgilityPack。

我将鼠标悬停在父节点上,它的子节点显示几个#text 节点。 XPath 值显示/code[1]/#text[1]。我尝试使用//#text 来获取所有文本节点,但我得到了那个错误:

错误:Expression must evaluate to a node-set.

我试过//text 并没有得到任何东西,但没有错误。

【问题讨论】:

什么将/code[1]/#text[1] 显示为 XPath?这不是有效的 XPath。 @LarsH 在当前 HtmlNode (name=code) 的 ChildNodes 中,打开第一个 #text 节点并在 VS 2008 调试器中向下滚动到它的 XPath,它显示 XPath。 好吧,我不熟悉 VS 2008 调试器,但它显示的“XPath”并不是真正的 XPath。 :-( # 不是语法的一部分。 【参考方案1】:

您需要使用text() 来获取文本节点。要获取文档中的所有文本节点,请使用//text()

来自specification:

text() 匹配任何文本节点。

【讨论】:

这有点用。我有父节点,我做了 parent.SelectNodes("//text()") ,我得到了父节点的所有文本节点,还有文档中父节点下面的所有其他文本节点 - 奇怪!我必须做 parent.SelectNodes(parent.XPath + "//text()") 来获取所有文本,但这不会仍然给孩子们的文本像样式等吗?。 试试parent.SelectNodes("text()")。我不明白你问题的最后一部分...... @Chuck,你得到的所有文本节点都是父节点的后代,这正是// 的用途。 //descendant:: 的缩写。如果您只想要作为parent 的直接子级的文本节点,请使用child::text()。正如@lonesome 所建议的那样,它的缩写就是text() @LarsH 谢谢,child::text() 是我问题的答案。如果您可以移动/复制此评论作为答案,我会检查它。 @Chuck,继续接受@lonesome 的回答......他的parent.SelectNodes("text()") 建议等同于parent.SelectNodes("child::text()"),并且是通常使用的。

以上是关于XPath 搜索所有文本节点,而不是任何其他子节点的内部文本的主要内容,如果未能解决你的问题,请参考以下文章

XPath / XQuery:在节点中查找文本,但忽略特定后代元素的内容

如何查找/获取文本节点的previous-sibling节点?

如果它是使用 XPath 在 Scrapy 中的其他节点的父节点,如何从子节点获取文本

Xpath:如何结合这两个子节点得到父节点?

Xpath

XPath语法