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节点?