2010-08-25 1 views
41

sto parsing di un documento XML che sembra qualcosa di simile:Utilizzando XPath sul singolo nodo restituisce gli elementi in tutti i nodi

<MyBook> 
    <title>Favorite Poems</title> 
    <issn>123-456</issn> 
    <pages>45</pages> 
</MyBook> 
<MyBook> 
    <title>Chocolate Desserts</title> 
    <issn>654-098</issn> 
    <pages>100</pages> 
</MyBook> 
<MyBook> 
    <title>Jabberwocky</title> 
    <issn>454-545</issn> 
    <pages>19</pages> 
</MyBook> 

Io uso XPath per tirare fuori i nodi MyBook e scorrere attraverso di loro in questo modo:

xmldoc.xpath("//MyBook").each do |node| 
    mytitle=node.xpath("//title").text 
    puts mytitle 
end 

l'output è simile al seguente:

Favorite PoemsChocolateDessertsJabberwocky 
Favorite PoemsChocolateDessertsJabberwocky 
Favorite PoemsChocolateDessertsJabberwocky 

come se il nodo è in realtà l'intera xmldoc. Tuttavia se stampo il nodo all'interno dell'iteratore, ogni volta che è ciò che mi aspetto, solo un singolo nodo MyBook. Devo essere in grado di estrarre i nodi figlio da ciascun nodo successivamente, non tutti dello stesso tipo di nodo figlio dall'intero documento. Che cosa sto facendo di sbagliato?

risposta

67

Quando si utilizza //title questa ricerca di tutti gli elementi <title> inizia dalla radice del documento. Utilizzare semplicemente title per trovare titoli secondari o .//title se si desidera trovare i titoli anche se sono nidificati all'interno di altri elementi.

+0

aha! Grazie mille. Quindi non importa che sto applicando l'espressione xpath a un nodo? – Sabrina

+2

Mettere '/' o '//' in primo piano rende l'XPath un percorso assoluto. Quando si utilizzano quelli, il programma di valutazione XPath ignora il nodo di contesto e inizia dalla radice del documento. –

+0

@JohnKugelman http://stackoverflow.com/questions/36412067/use-nokogiri-xpath-to-select-root-and-children-matching-expression – karl

0

Rimuovi // dall'espressione titolo xpath.