使用XPath选择包含特定内部文本的子节点的节点

27

给定以下XML:

<root>
    <li><span>abcText1cba</span></li>
    <li><span>abcText2cba</span></li>
</root>
我想要选择所有具有包含"Text1"文本的span子节点的li元素,并使用XPath。我一开始尝试使用/root/li [span],然后进一步检查了/root/li[span[contains(text(), 'Text1')]]。但是,这并没有返回任何节点。我不明白原因,请问有人可以帮忙吗?

2
你的XPath是正确的。你使用的处理器可能存在一些严重的错误,或者你可能调用它时出现了问题。顺便说一句,我认为/li[contains(span, 'Text1')]更加优雅和简短。你肯定不需要使用text(),只需使用.,因为它会自动转换为原子值。 - dirkk
你的第二个XPath看起来是正确的。也许是命名空间问题?你的XML实际上在一个命名空间中吗? - adamretter
1
仅供澄清,因为它在过去几年中获得了一些赞:这是一个命名空间问题。 - D.R.
6个回答

28

仅供读者参考。XPath是正确的。

OP:也许XPath解析器不支持该表达式?

/root/li[span[contains(text(), "Text1")]]

23
//li[./span[contains(text(),'Text1')]] - have just one target result
//li[./span[contains(text(),'Text')]] - returns two results as target

这种方法使用的东西在任何地方都没有很好的文档记录,只有少数人了解它的强大之处。

输入图像描述

Xpath指定的元素有一个由另一个Xpath定义的子节点。

输入图像描述


1
在我的情况下有效的方法是: //element1[./childElement[ condition ]] - Bhanu Chhabra
5
这有点离题,但我真的想感谢你提供的第一张屏幕截图,从中我学到了在Chrome的JS控制台中可以执行XPath查询! - BergListe

4

要深入检查嵌套的子元素,请在您的Xpath表达式中使用.//*

<div class="foo h1">
    <p>
      <span>
         <b>bar</b>
      </span>
    </p>
</div>

要查找一个带有类名为.foo
元素,且其包含有文本为bar的子元素,只需使用以下xpath表达式。
$x('//div[contains(@class, "foo") and .//*[contains(text(), "bar")]]')

4

这是 Kent Kostelac 给出的 XPath:

//span[contains(text(), 'Text1')]/parent::li

也可以这样呈现:

//li[span[contains(text(), 'Text1')]]

这段文字想表达的是通过使用“包含显示'Text1'的span的li”来代替“可以看到显示'Text1'的span吗?好的,请给我它的li父级”,从而缩短了描述,并提高了可读性。


1
尝试这个XPath。
li/*[@innertext='text']

这将忽略该范围。 - ggorlen

1
您当前的xpath应该是正确的。这里有一个丑陋但可行的替代方案。
XmlNodeList nodes = doc.SelectNodes("//span/parent::li/span[contains(text(), 'Text1')]/parent::li");

我们找到所有的 span 标签。然后我们找到所有具有 span 标签为子元素并包含“Text1”的 li 标签。
或者简单地说:
//span[contains(text(),'Text1')]/parent::li

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接