rubi, LibXML recebendo os nós filhos que correspondem um XPath
Pergunta
Eu preciso para obter os nós filhos de um nó utilizando XPath como eu quero "drill down" em um nó. Aqui está o código que estou tentando:
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()
}
}
E aqui está um XML fragmento
<Document xmlns="http://www.google.com/books/">
<View>
<Books>
<Title>pragmatic programming</Title>
</Books>
<Comics>
<Title>x-men</Title>
</Comics>
</View>
</Document>
As primeiras obras find encontrar e retorna o nó Books. No entanto, a segunda find ( '// Documento: Título'). Retornar todos os nós de título no documento, embora eu só estou procurando nos gânglios encontrados
Por que isso aconteceu? Eu cansado modificar o segundo XPath, mas nada que eu tenho obras cansados. Algum conselho?
Solução
Os nós xml_document
devolvidos nunca são quebrados da fonte original. Você sempre pode se mover para trás e para a frente, a única diferença é que o "ponteiro" está no nó constatada atual.
O que você precisa fazer é mudar o seu XPath de tal forma que ele não faz uma "busca documento completo": o //
especial (que é "descendente-ou-auto" ) começa no raiz e atravessa todos os nós. Em vez disso, use o seguinte:
book_title_xpath = 'Document:Title'
que irá retornar o primeiro filho com o nome de "Título". Se você precisa pesquisar todos os subnós do nó do livro, você pode fazer o seguinte:
book_title_xpath = './/Document:Title'
que adiciona a .
e meios "começar no nó atual e procurar o nó atual e todos os descendentes" .
Outras dicas
try
book_title_xpath = 'Title'