2010-07-04 4 views

Répondre

7

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!

+3

Bien que cette réponse soit correcte, il existe certains problèmes terminologiques. Dans XPath "node" est quelque chose de différent de "element". En particulier, le 'root node', sélectionné par l'expression XPath'/'n'est * pas * un élément. Aussi, en plus des enfants d'élément un élément peut avoir des enfants de type: noeud de texte, commentaire et instruction de traitement. Veuillez corriger les instructions dans votre réponse en vous référant à "node" pour faire référence à "element". –

+1

@Dimitre Novatchev: Oups, vous avez raison, bien sûr - merci de le signaler. J'ai ajusté la réponse en conséquence (et ajouté une démonstration de la différence en bonus;) –

+1

@Dimitre Novatchev: BTW, compte tenu de votre nombre de rep, pourquoi ne pas simplement corriger des erreurs comme celle-ci directement? –

Questions connexes