我的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')]]
您的XPath不包含bi
,因此它不会选择bi
-节点。
开始于
//ul/bi
选择bi
节点。现在在方括号中添加条件。第一个条件是“父节点具有li
-子节点:
//ul/bi[../li]
第二个条件是:li
-节点包含文本:
//ul/bi[../li[contains(.,'ModelA')]]
但是,在有多个bi
节点的情况下,这可能无法满足您的需求。如果确实只需要下一个bi
节点,则the answer中的@Jack Fleeting可能是最好的。
如果我正确理解了您的问题,可以解决这个问题:
//ul/li[contains(.,'ModelA')]/following-sibling::bi
编辑:在下面的评论中,@ Thomas Weller的正确观察之后,这是对此xpath表达式的简单解释:
您的目标<bi>
是目标<ul>
的孩子,目标<li>
本身又有另一个孩子(//ul/li
,因此是<li>
部分),该孩子本身(即li[contains(.,'ModelA')]
)包含文本[C0 ])。由于<li>
和<bi>
都作为同一个<ul>,
的子代,因此一旦找到<li>
,下一站就是找到其同级<bi>
(因此,最后一个/following-sibling::bi
)。 >
如果不需要继承者–如果sibling
您为什么要为此使用contains()
?只需使用“ =”。