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?

Foi útil?

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'

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top