我想使用xpath的text()attribut访问一个元素,其结构如下所示。
<root>
<child>
<lowerchild>
<lowestchild>
My text
</lowestchild>
</lowerchild>
</child>
</root>
//child[contains(text(), 'My text')]
应该返回子元素。和
//lowerchild[contains(text(), 'My text')]
应该返回lowerchildelement。
我使用HTMLAgilityPack尝试了XPath命令,但他们无法找到这些元素。
我的小项目的最终结果是一个小的xpath-searcher,所以用户给出了元素的名称attribut和值,所以如果你只给我一个解决方案,那就太好了。它可以是任何随机结构。如果元素名称加倍,就好像我们有2个最低子元素,而不是我想选择最低的“低”。希望您能够帮助我。
答案 0 :(得分:2)
而不是
//child[contains(text(), 'My text')]
看起来你想要
//child[contains(., 'My text')]
XPath表达式text()
(带有隐式child::
轴)选择任何文本节点作为上下文节点的子节点。在上面的示例中,它仅选择作为child
元素的直接子元素的文本节点。在您展示的XML中,child
元素有两个子文本节点,它们之间有lowerchild
元素。两个文本节点只包含空格,因此可能会被某些处理器剥离,具体取决于设置。
如果将节点集或序列作为第一个参数传递给contains(a, b)
,它将获取第一个节点并将其转换为字符串。因此,您的参数将转换为仅包含空格的字符串,否则为空字符串(如果仅删除空白文本节点)。
但是如果不是text()
而是将.
作为contains()
的第一个参数传递,那么上下文节点(child
)将转换为字符串。这意味着连接child
的所有文本节点后代的值,而不仅仅是直接文本节点子级。 (它有点像DOM innerText
,你的问题标题提到了,但不包括元素的开始/结束标记,也不包括属性。)因此,//child[contains(., 'My text')]
将返回child
元件。