Найти узел XML с конкретным потомком, используя GPath - PullRequest
0 голосов
/ 11 июня 2019

Я ищу выражение 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::*

В этом точном сценарии это подойдет, но я не большой поклонник материнского топора. Предположим, что уровней дочерних узлов будет намного больше, как я могу использовать «вложенные» предикаты? Вернуть узел, у которого есть дочерний элемент, у которого есть дочерний элемент ...?

Большое спасибо!

1 Ответ

1 голос
/ 11 июня 2019

Вы можете использовать tr в качестве корня для поиска и использовать свойство глубины первый ** для поиска по всему поддереву

xmlDoc.tr.find { tr -> tr.'**'.find { it.name() == 'td' && it.text() == '1' } }
...