2013-02-25 24 views
17

Credo che questo dovrebbe essere in grado di rispondere usando solo XPath standard senza riferimento all'implementazione, ma solo per riferimento sto usando gli oggetti DOM XML in .Net (spazio dei nomi System.Xml) .XPath per selezionare tutti gli elementi con un nome specificato

Ho un nodo consegnato alla mia funzione, da qualche parte in profondità all'interno di un documento XML, e voglio selezionare tutti gli elementi discendenti di questo nodo che hanno un nome specifico, indipendentemente dal percorso intermedio verso quei nodi. La chiamata sto facendo si presenta così:

node.SelectNodes("some XPath here"); 

Il nodo su cui sto lavorando con un look simile a questa:

... 
<food> 
    <tart> 
    <apple color="yellow"/> 
    </tart> 
    <pie> 
    <crust quality="flaky"/> 
    <filling> 
     <apple color="red"/> 
    </filling> 
    </pie> 
    <apple color="green"/> 
</food> 
... 

Quello che voglio è una lista di tutti i nodi "Apple" , cioè 3 risultati. Ho provato un paio di cose diverse, ma nessuna di esse ottiene ciò che voglio.

node.SelectNodes("apple"); 

Questo mi dà un risultato, la mela verde.

node.SelectNodes("*/apple"); 

Questo mi dà un risultato, la mela gialla.

node.SelectNodes("//apple"); 

Questo mi dà centinaia di risultati, si presenta come ogni nodo mela nel documento, o almeno forse ogni nodo di Apple che è un figlio diretto della radice del documento.

Come si crea un XPath che mi fornirà tutti i nodi Apple sotto il nodo corrente, indipendentemente dalla profondità del nodo corrente in cui si trovano? In particolare, in base al mio esempio sopra, dovrei ottenere tre risultati: le mele rosse, verdi e gialle.

risposta

25

Prova .//apple. Elenca tutti i nodi apple discendenti del nodo corrente. Per una migliore comprensione di questo argomento, dovresti imparare come funzionano gli assi XPath. Ad esempio, potresti anche scrivere descendant::apple.

+0

Perfetto, questo è esattamente quello che stavo cercando. Ho cercato su Google per un'ora e non sono riuscito a trovarlo. Giusto per chiarire, per vedere che ho capito bene la sintassi - le doppie barre mi danno tutti i nodi apple indipendentemente dalla profondità (come ho provato nella mia domanda sopra), e il punto prima di loro limita la selezione ai discendenti del nodo corrente. È corretto? –

+0

Sì, è corretto. Ho anche modificato il mio post per darti alcuni suggerimenti aggiuntivi. – nwellnhof

+0

Hai modificato la tua risposta per dire che dovrei imparare come funzionano gli assi XPath - Sono d'accordo. Hai qualche suggerimento su buone risorse che dovrei controllare? –

Problemi correlati