2009-10-25 9 views
3

J'ai besoin d'obtenir les nœuds enfants d'un nœud en utilisant XPath car je veux "descendre" dans un nœud. Voici le code que je suis en train:ruby, libxml obtenir les nœuds enfants qui correspondent à un xpath

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

Et voici un fragment XML

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

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

Les premiers travaux FIND trouver et retourne le nœud Livres. Cependant, la seconde recherche ('// Document: Titre') renvoie tous les noeuds Titre dans le document même si je ne recherche que dans les noeuds trouvés.

Pourquoi cela se produirait-il? J'ai fatigué de modifier le second XPath, mais rien de fatigant ne marche. Aucun conseil?

Répondre

3

Les nœuds xml_document renvoyés ne sont jamais rompus à partir de la source d'origine. Vous pouvez toujours vous déplacer en arrière et en avant, la seule différence est que le "pointeur" se trouve sur le nœud trouvé.

Ce que vous devez faire est de changer votre XPath de telle sorte qu'il ne fait pas une « recherche complète de documents »: le // spécial (qui est « descendant ou soi ») commence à la racine et traverse tous nœuds. Au lieu de cela, utilisez ce qui suit:

book_title_xpath = 'Document:Title' 

qui retournera le premier enfant avec le nom "Titre". Si vous devez rechercher tous les sous-nœuds du nœud livre, vous pouvez effectuer les opérations suivantes:

book_title_xpath = './/Document:Title' 

qui ajoute l'. et des moyens « commencer au niveau du noeud en cours et recherchez le nœud actuel et tous les descendants ».

+0

thx, pensait que je l'avais essayé, mais je suppose que je n'avais pas. –

0

essayer

book_title_xpath = 'Title'