2010-10-13 5 views

Répondre

56

Utilisation:

//node()[not(node())] 

En cas seulement élément nœuds feuilles sont recherchés (ce qui a besoin d'éclaircissements - sont des éléments qui ont des enfants non-éléments considérés comme des noeuds feuilles?), Le XPath suivant expression les choisit:

//*[not(*)] 

les deux expressions ci-dessus sont probablement les plus brefs que sélectionner les paramètres souhaités nœuds (nœuds any-node ou element-leaf).

+0

Pouvez-vous expliquer pourquoi cela fonctionne? J'ai examiné la syntaxe XPath et quelques tutoriels, mais je ne comprends pas très bien pourquoi cela fonctionne. – rrs

+0

@rrs: La première expression sélectionne n'importe quel noeud dans le document XML qui n'a pas d'enfants - c'est ce qu'est un noeud feuille - par définition. La seconde fait quelque chose de similaire, mais elle sélectionne tout élément qui n'a pas d'élément enfant. –

+0

Je comprends ce qu'il fait, mais pas comment il le fait. Pourquoi/comment 'not (*)' sélectionne-t-il des nœuds/éléments de feuille? – rrs

1

Pourquoi moins ou égal à 1?

xmlNode.SelectNodes("//*[count(child::*) = 0]")

Faire des tests etc sur ce site http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm

Assez utile ..

+0

Merci beaucoup. Cela fonctionne très bien. Donc, c'est plus de style VB égal. Je pensais que ce devrait être un style c parce que les fonctions sont sensibles à la casse. Pourquoi <= 1? J'ai été confondu par ChildNodes.Count qui renvoie 1 pour x, mais renvoie 0 pour . – newman

+0

et @miliu: le test de compte n'est pas nécessaire. Vérifiez la réponse de @kevpie. –

+0

@Alejandro, en effet .. –

24

Tous les éléments sans élément enfant

//*[not(child::*)] 
+0

Merci beaucoup. Cela fonctionne très bien aussi. – newman

+2

+1 Bonne réponse.Mais cela signifie: * tous les éléments sans élément enfant *. Ainsi, il va sélectionner des éléments avec un nœud de texte enfant, des éléments vides, des éléments avec un contenu mixte (nœuds de texte, PI, commentaires) –

+0

+1 @Alejandro, la clarification est appréciée! – kevpie

0

J'ajoute cette réponse XSLT puisqu'elle semble que les matches de face de google manquent d'une telle solution:

Après une longue lutte avec extraction CDATA comme XML, par la suite, cette expression a le mieux fonctionné pour moi:

<xsl:template match="*[not(child::*)]/text()"> 
Questions connexes