【问题标题】:XPath search for all text nodes, not the inner text of any other child nodeXPath 搜索所有文本节点,而不是任何其他子节点的内部文本
【发布时间】: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。 :-( # 不是语法的一部分。

标签: c# html xpath html-agility-pack


【解决方案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()"),并且是通常使用的。
猜你喜欢
  • 1970-01-01
  • 2014-10-02
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-01
相关资源
最近更新 更多