XPath innerText忽略子项

时间:2013-06-27 14:21:01

标签: text xpath parent innertext

我想使用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个最低子元素,而不是我想选择最低的“低”。希望您能够帮助我。

1 个答案:

答案 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元件。