【问题标题】:Select a node with XPath whose child node contains a specific inner text选择具有 XPath 的节点,其子节点包含特定的内部文本
【发布时间】:2014-10-02 23:13:45
【问题描述】:

给定以下 XML:

<root>
    <li><span>abcText1cba</span></li>
    <li><span>abcText2cba</span></li>
</root>

我想选择所有具有span 子节点的li 元素包含 Text1 的内部文本 - 使用 XPath。

我从/root/li[span] 开始,然后尝试进一步检查:/root/li[span[contains(text(), 'Text1')]]

但是,这不会返回任何节点。我不明白为什么,有人可以帮助我吗?

【问题讨论】:

  • 您的 XPath 是正确的。您使用的是哪个处理器,或者它确实有一些严重的错误,或者您可能称它错误。作为旁注,我认为/li[contains(span, 'Text1')] 更优雅更短一些。您当然不需要text(),只需使用.,因为它会自动转换为原子值。
  • 您的第二个 XPath 看起来确实正确。也许是命名空间问题?你的 XML 实际上是在命名空间中吗?
  • 只是为了澄清,因为多年来它得到了一些支持:这是一个命名空间问题。

标签: xml xpath


【解决方案1】:

xpath Kent Kostelac 提供:

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

也可以这样表示:

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

这有点短,并通过说“给我包含显示'Text1'的跨度的li”来提高可读性; 而不是说“你能看到显示 'Text1' 的跨度吗?好的,所以给我它的 li 父级”,这就是原始措辞的实际意思。

【讨论】:

    【解决方案2】:
    //li[./span[contains(text(),'Text1')]] - have just one target result
    //li[./span[contains(text(),'Text')]] - returns two results as target
    

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

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

    【讨论】:

    • 对我有用的是 //element1[./childElement[ condition ]]
    • 这有点过时,但我真的要感谢你的第一个屏幕截图,从中我了解到可以在 Chrome 的 JS 控制台中进行 XPath 查询!
    【解决方案3】:

    仅供读者阅读。 xpath 是正确的。 OP:也许 xpath 解析器不支持表达式?

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

    【讨论】:

      【解决方案4】:

      您当前的 xpath 应该是正确的。这是另一种但丑陋的。

      XmlNodeList nodes = doc.SelectNodes("//span/parent::li/span[contains(text(), 'Text1')]/parent::li");
      

      我们找到了所有的跨度标签。然后我们找到所有以 span-tag 为子级并包含“Text1”的 li-tags。

      或者简单地说:

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

      【讨论】:

        【解决方案5】:

        试试这个 XPath

        li/*[@innertext='text']
        

        【讨论】: