Pregunta

Necesito obtener los nodos secundarios de un nodo usando XPath ya que quiero "profundizar" en un nodo Aquí está el código que estoy intentando:

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()  
    }  
}  

Y aquí hay un fragmento XML

 <Document xmlns="http://www.google.com/books/">  
     <View>  
         <Books>  
             <Title>pragmatic programming</Title>  
         </Books>  

         <Comics>  
             <Title>x-men</Title>  
         </Comics>  
     </View>  
 </Document>  

El primer hallazgo funciona encuentra y devuelve el nodo Libros. Sin embargo, el segundo hallazgo ('// Documento: Título') devuelve todos los nodos de Título en el documento a pesar de que solo estoy buscando en los nodos encontrados.

¿Por qué sucedería esto? Me cansé de modificar el segundo XPath, pero nada de lo que me cansé funciona. ¿Algún consejo?

¿Fue útil?

Solución

Los nodos xml_document devueltos nunca se rompen de la fuente original. Siempre puede moverse hacia adelante y hacia atrás, la única diferencia es que el '' puntero '' está en el nodo encontrado actual.

Lo que debe hacer es cambiar su XPath de modo que no realice una búsqueda completa de documentos: el // especial (que es " descendant-or- self " ) comienza en la raíz y atraviesa todos los nodos. En su lugar, use lo siguiente:

book_title_xpath = 'Document:Title'

que devolverá el primer hijo con el nombre " Título " ;. Si necesita buscar todos los subnodos desde el nodo Libro, puede hacer lo siguiente:

book_title_xpath = './/Document:Title'

que agrega el . y significa " comenzar en el nodo actual y buscar el nodo actual y todos los descendientes " .

Otros consejos

prueba

book_title_xpath = 'Título'

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top