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?

È stato utile?

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'

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top