ruby, libxml che ottiene i nodi figlio che corrispondono a un xpath
Domanda
Ho bisogno di ottenere i nodi figlio di un nodo usando XPath come voglio " drill down " in un nodo. Ecco il codice che sto provando:
xml_ns = 'Document:http://www.google.com/books/'
xml_document = XML::Document.file('./test_pages/test.xml')
book_xpath = '//Document:View/Document:Books'
book_title_xpath = '//Document:Title'
xml_document.find(book_xpath, xml_ns).each() { | item |
puts item
item.find(book_title_xpath, xml_ns).each() { |item2|
puts '========================'
puts 'name: ' + item2.content().strip()
}
}
Ed ecco un frammento XML
<Document xmlns="http://www.google.com/books/">
<View>
<Books>
<Title>pragmatic programming</Title>
</Books>
<Comics>
<Title>x-men</Title>
</Comics>
</View>
</Document>
Le prime ricerche trovano e restituiscono il nodo Libri. Tuttavia, la seconda ricerca ('// Document: Title') restituisce tutti i nodi Title nel documento anche se sto solo cercando nei nodi trovati.
Perché dovrebbe succedere? Mi sono stancato di modificare il secondo XPath, ma nulla di ciò che ho stanco funziona. Qualche consiglio?
Soluzione
I nodi xml_document
restituiti non vengono mai interrotti dalla fonte originale. Puoi sempre spostarti avanti e indietro, l'unica differenza è che il "puntatore" si trova nel nodo trovato corrente.
Quello che devi fare è cambiare il tuo XPath in modo tale che non esegua una "ricerca completa del documento": lo speciale //
(che è "descendant-or- self " ) inizia dalla radice e attraversa tutti i nodi. Utilizzare invece quanto segue:
book_title_xpath = 'Document:Title'
che restituirà il primo figlio con il nome " Titolo " ;. Se è necessario cercare tutti i nodi secondari dal nodo Libro, è possibile effettuare le seguenti operazioni:
book_title_xpath = './/Document:Title'
che aggiunge il .
e significa " inizia dal nodo corrente e cerca il nodo corrente e tutti i discendenti " .
Altri suggerimenti
try
book_title_xpath = 'Title'