Я ищу выражение 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
, который содержит элемент td
с атрибутом price
и текстом 95
.
В 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::*
В этом точном сценарии это сработало бы, но я не большой поклонник родительского топора. Предположим, что было бы намного больше уровней дочерних узлов, как бы я поступил с «вложенными» предикатами? Вернуть узел, у которого есть дочерний элемент, у которого есть дочерний...?
Большое спасибо!
Вы можете использовать tr
в качестве корня для поиска и использовать свойство поиска в глубину **
для поиска по всему поддереву.
xmlDoc.tr.find { tr -> tr.'**'.find { it.name() == 'td' && it.text() == '1' } }
Именно то, что я искал, большое спасибо.