Ваш пример не имеет корневой элемент, поэтому я полагаю, что-то вроде этого:
<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]'
Это было бы выбрать А и В, как корневой элемент будет считаться одним предком, а корневой узел «/» - другим!
Примеры пожалуйста. – Oded