【问题标题】:How to use XPath contains()如何使用 XPath contains()
【发布时间】:2019-11-21 17:41:20
【问题描述】:

我的 XML

<r>
  <ul>
    <li>ModelA</li>
    <bi>Foo</bi>
  </ul>
  <ul>
    <li>ModelB</li>
    <bi>boo</bi>
  </ul>
</r>

对于特定的节点值,我想提取后继节点的值。

例子当li = ModelA 得到bi 的值为Foo

我的 Xpath://ul[li[contains(.,'ModelA')]]

【问题讨论】:

    标签: xml xpath


    【解决方案1】:

    您的 XPath 不包含 bi,因此它不会选择 bi-Node。

    开始

    //ul/bi
    

    选择bi-节点。现在在方括号中添加条件。第一个条件是“父节点有一个li-subnode:

    //ul/bi[../li]
    

    第二个条件是:li-node 包含文本:

    //ul/bi[../li[contains(.,'ModelA')]]
    

    但是,如果有多个 bi 节点,这可能无法满足您的要求。如果你真的只需要下一个 bi 节点,the answer@Jack Fleeting 可能是最好的。

    【讨论】:

      【解决方案2】:

      如果我正确理解您的问题,这可能会解决问题:

      //ul/li[contains(.,'ModelA')]/following-sibling::bi
      

      编辑: 继@Thomas Weller 在下面的 cmets 中的正确观察之后,这里简单解释一下这个 xpath 表达式:

      您的目标&lt;bi&gt; 是目标&lt;ul&gt; 的子目标,它本身还有另一个子目标(&lt;li&gt;,因此是//ul/li 部分),它本身(即&lt;li&gt;)包含文本@ 987654327@)。由于&lt;li&gt;&lt;bi&gt; 作为同一个&lt;ul&gt;, 的子代是兄弟姐妹,一旦找到&lt;li&gt;,下一站就是定位其兄弟姐妹&lt;bi&gt;(因此是最终的/following-sibling::bi)。

      【讨论】:

      • 如果添加一些解释,答案可能会在OP方面达到一些学习效果。否则,它只是复制/粘贴解决我的问题。
      • @ThomasWeller - 新的一天(和更多的咖啡)看来你是对的;我不应该急于回答。对于那个很抱歉。请参阅上面的编辑。
      【解决方案3】:

      如果它不需要是继任者 - 如果 sibling 就足够了 - 只需将 bi 添加到 XPath 的末尾:

      //ul[li[contains(.,'ModelA')]]/bi
      

      将选择所有具有li siblingsbi 元素,其字符串值包含'ModelA 子字符串。如果您实际上想要相等而不是子字符串测试,则可以将其简化为

      //ul[li='ModelA']/bi
      

      另见What does contains() do in XPath?

      【讨论】:

        【解决方案4】:

        您为什么要为此使用contains()?只需使用“=”。

        //ul/li[. = 'ModelA')]/following-sibling::bi
        

        contains() 函数仅在您想要匹配子字符串时才需要,例如,如果您还想要匹配值为 SuperModelA2 的节点时

        【讨论】:

          猜你喜欢
          • 2018-12-05
          • 2012-06-16
          • 2010-11-07
          • 2012-01-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-19
          相关资源
          最近更新 更多