ruby, libxml obteniendo los nodos secundarios que coinciden con un xpath
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?
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'