Получить элементы определенного уровня иерархии - PullRequest
2 голосов
/ 04 июля 2010

Есть ли способ извлечь все элементы определенного уровня иерархии, используя XPath?

Upd.

<A>
   <B>1</B>
   <B>2</B>
</A>
<C>
   <D>3</D>
   <D>4</D>
</C>

Мне нужно получить все элементы B и D (уровень иерархии = 2)

1 Ответ

9 голосов
/ 04 июля 2010

В вашем примере отсутствует корневой элемент, поэтому я предполагаю что-то вроде этого:

<ROOT>
  <A>
    <B>1</B>
    <B>2</B>
  </A>
  <C>
    <D>3</D>
    <D>4</D>
  </C>
</ROOT>

При этом простой версией будет просто использовать соответствующее количество подстановочных знаков 'any element', чтобы получить ваш результат:

xpath = '/*/*/*'

(имеется в виду «выбрать любой дочерний элемент любого дочернего элемента любого корневого элемента»)

В качестве альтернативы, если вы хотите выразить уровень численно, вы можете использовать:

xpath = '//*[count(ancestor::*) = 2]'

(имеется в виду «выбрать любой элемент с 2 предками»)


Редактировать / Заметьте: Как правильно отметил Димитр Новатчев, важно различать узлов и элементов , и я исправил свой ответ соответственно.(Хотя сами элементы являются узлами, есть также шесть других типов узлов !)

Различие можно проиллюстрировать на данном примере, слегка изменив xpath на основе предка:

xpath = '//*[count(ancestor::node())=2]'

При этом будут выбраны A и B , поскольку корневой элемент будет считаться одним узлом-предком, а корневой узел '/' - другим!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...