2010-07-04 3 views
2

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

Обновление.

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

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

+0

Примеры пожалуйста. – Oded

ответ

7

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

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

С этим, простой версией было бы просто использовать соответствующее количество подстановочных знаков «любого элемента», чтобы получить ваш результат:

xpath = '/*/*/*' 

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

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

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

(Значение «выбрать любой элемент с 2-х предков)


Редактировать/Примечание: Как Dimitre Novatchev правильно указал, что важно проводить различие между узлов и элементов, и я исправил свой ответ соответственно. (! В то время как элементы являются узлами себя, there are also six other types of nodes)

Различие может быть проиллюстрировано с помощью приведенного примера, слегка изменяя XPath на основе предок:

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

Это было бы выбрать А и В, как корневой элемент будет считаться одним предком, а корневой узел «/» - другим!

+3

Хотя этот ответ верен, существуют определенные терминологические проблемы. В XPath «узел» - это что-то вообще отличное от «элемента». В частности, «корневой узел», выбранный выражением XPath '/', является * не * элементом. Кроме того, помимо дочерних элементов элемента может быть дочерний тип типа: текстовый узел, комментарий и инструкция обработки. Исправьте утверждения в своем ответе, ссылаясь на «узел», чтобы ссылаться на «элемент». –

+1

@Dimitre Novatchev: Oups, Вы правы, конечно - спасибо, что указали это. Я соответствующим образом скорректировал ответ (и добавил демонстрацию разницы в качестве бонуса;) –

+1

@Dimitre Novatchev: Кстати, учитывая ваш показатель репутации, почему бы просто не исправить ошибки, подобные этому непосредственно? –

Смежные вопросы