使用 GPath 查找具有特定子节点的 XML 个节点
Find XML node with a specific child using GPath
我正在寻找 GPath 表达式来查找具有特定子节点的节点。
<table>
<tr>
<td name="line">1</td>
<td name="price">10</td>
</tr>
<tr>
<td name="line">2</td>
<td name="price">95</td>
</tr>
<tr>
<td name="line">3</td>
<td name="price">43</td>
</tr>
</table>
在上面的示例 XML 中,我想检索整个 tr
元素,其中包含具有属性 price
和文本 [=18= 的 td
元素].
在 XPath 中我会这样写:
//tr[td[@name='price' and text()='95']]
我试过并有效的代码如下所示...
xmlDoc.tr.td.find { node -> node.text() == '1' }.parent()
...但这更像他的 XPath 等价物:
//tr/td[@name='price' and .='95']/parent::*
在这个确切的场景中它会做,但我不是父斧头的忠实粉丝。假设会有更多的子节点级别,我将如何处理 "nested" 谓词? Return 一个有子节点的节点有子节点...?
非常感谢!
您可以使用 tr
作为查找的根,并使用深度优先 属性 **
来搜索整个子树
xmlDoc.tr.find { tr -> tr.'**'.find { it.name() == 'td' && it.text() == '1' } }
我正在寻找 GPath 表达式来查找具有特定子节点的节点。
<table>
<tr>
<td name="line">1</td>
<td name="price">10</td>
</tr>
<tr>
<td name="line">2</td>
<td name="price">95</td>
</tr>
<tr>
<td name="line">3</td>
<td name="price">43</td>
</tr>
</table>
在上面的示例 XML 中,我想检索整个 tr
元素,其中包含具有属性 price
和文本 [=18= 的 td
元素].
在 XPath 中我会这样写:
//tr[td[@name='price' and text()='95']]
我试过并有效的代码如下所示...
xmlDoc.tr.td.find { node -> node.text() == '1' }.parent()
...但这更像他的 XPath 等价物:
//tr/td[@name='price' and .='95']/parent::*
在这个确切的场景中它会做,但我不是父斧头的忠实粉丝。假设会有更多的子节点级别,我将如何处理 "nested" 谓词? Return 一个有子节点的节点有子节点...?
非常感谢!
您可以使用 tr
作为查找的根,并使用深度优先 属性 **
来搜索整个子树
xmlDoc.tr.find { tr -> tr.'**'.find { it.name() == 'td' && it.text() == '1' } }