Votre exemple, il manque un élément racine, donc je suppose quelque chose comme ceci:
<ROOT>
<A>
<B>1</B>
<B>2</B>
</A>
<C>
<D>3</D>
<D>4</D>
</C>
</ROOT>
Avec cela, une version simple serait d'utiliser simplement le nombre approprié de caractères génériques 'any element' pour obtenir votre résultat:
xpath = '/*/*/*'
(qui signifie « sélectionner un élément enfant de tout élément enfant d'un élément racine »)
Alternativement, si vous voulez exprimer le niveau numérique, vous pouvez utiliser:
xpath = '//*[count(ancestor::*) = 2]'
(Signification « sélectionner un élément avec 2 ancêtres)
Modifier/Note: Comme Dimitre Novatchev souligné à juste titre, il est important de faire la différence entre nœuds et éléments, et j'ai corrigé ma réponse en conséquence. (! Bien que les éléments sont des nœuds eux-mêmes, there are also six other types of nodes)
La différence peut être illustrée par l'exemple en modifiant l'ancêtre basé XPath légèrement:
xpath = '//*[count(ancestor::node())=2]'
Ce sélectionnerait A et B, comme l'élément racine compterait comme un noeud ancêtre, et le noeud racine '/' comme un autre!
Exemples s'il vous plaît. – Oded