2010-10-13 22 views
41

Credo sia possibile ma non sono riuscito a capire la sintassi. Qualcosa del genere:Come selezionare tutti i nodi foglia utilizzando l'espressione XPath?

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

ma questo non è corretto.

+0

Buona domanda, +1. Vedere la mia risposta per l'espressione XPath probabilmente più breve che seleziona esattamente tutti i nodi foglia. :) –

risposta

56

Uso:

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

Nel caso in cui solo elemento nodi foglia sono ricercati (e questo ha bisogno di chiarimenti - sono elementi che hanno figli non elemento considerato nodi foglia?), Allora la seguente XPath espressione li seleziona:

//*[not(*)] 

Entrambe le espressioni di cui sopra sono probabilmente il più breve che selezionare il desiderato nodi (qualsiasi nodo o elemento - nodi foglia).

+0

Puoi spiegare perché funziona? Ho esaminato la sintassi XPath e alcuni tutorial, ma non riesco a capire perché funzioni. – rrs

+0

@rrs: la prima espressione seleziona qualsiasi nodo nel documento XML che non ha figli - questo è ciò che un nodo foglia è - per definizione. Il secondo fa qualcosa di simile, ma seleziona qualsiasi elemento che non ha un elemento figlio. –

+0

Capisco cosa fa, ma non come lo fa. Perché/come 'non (*)' seleziona nodi foglia/elementi? – rrs

1

Perché meno o uguale a a 1?

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

Fai test ecc in questo sito http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm

Abbastanza utile ..

+0

Grazie mille. Funziona alla grande Quindi, è più lo stile VB uguale. Ho pensato che dovrebbe essere c-style perché le funzioni sono case-sensitive. Perché <= 1? Sono stato confuso da ChildNodes.Count che restituisce 1 per x, ma restituisce 0 per . – newman

+0

e @miliu: il test di conteggio non è necessario. Controlla la risposta @kevpie. –

+0

@ Alejandro, infatti .. –

24

Eventuali elementi con nessun bambino elemento

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

Grazie mille. Funziona anche alla grande. – newman

+2

+1 Risposta corretta.Ma significa: * qualsiasi elemento senza elemento figlio *. Quindi, selezionerà gli elementi con il nodo di testo figlio, elementi vuoti, elementi con contenuto misto (nodi di testo, PI, commenti) –

+0

+1 @Alejandro, il chiarimento è apprezzato! – kevpie

0

Sto aggiungendo questa risposta XSLT poiché sembra che le partite anteriori di Google non abbiano una soluzione del genere:

Dopo una lunga lotta con l'estrazione di CDATA come XML, alla fine, questa espressione ha lavorato meglio per me:

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