Rubin, libxml die untergeordneten Knoten erhalten, die einen XPath-Match
Frage
Ich brauche die untergeordneten Knoten eines Knotens mit XPath zu bekommen, wie ich „Drill-down“ in einen Knoten will. Hier ist der Code Ich versuche:
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()
}
}
Und hier ist ein XML-Fragment
<Document xmlns="http://www.google.com/books/">
<View>
<Books>
<Title>pragmatic programming</Title>
</Books>
<Comics>
<Title>x-men</Title>
</Comics>
</View>
</Document>
Die ersten Fund Arbeiten finden und gibt die Bücher Knoten. Doch die zweite find ( ‚// Dokument: Titel‘) zurückkehrt alle Titel Knoten im Dokument, obwohl ich nur in dem gefundenen Knoten bin auf der Suche
.Warum soll dies geschehen? Ich habe müde, um das zweite XPath ändern, aber nichts, was ich habe müde funktioniert. Jede Beratung?
Lösung
Die zurück xml_document
Knoten sind nie von der ursprünglichen Quelle gebrochen. Sie können immer hin und her bewegen, der einzige Unterschied ist, dass der „Zeiger“ auf dem aktuellen Ergebnisknoten ist.
Was Sie tun müssen, ist Ihre XPath zu ändern, so dass es nicht eine „vollständige Dokumentsuche“ macht: der besonderen //
(die „descendant-or-self“ ) bei der beginnt Wurzel- und durchläuft alle Knoten. Verwenden Sie stattdessen wie folgt vor:
book_title_xpath = 'Document:Title'
, die das erste Kind mit dem Namen „Titel“ zurück. Wenn Sie alle untergeordneten Knoten aus dem Buch Knoten suchen, dann können Sie wie folgt vor:
book_title_xpath = './/Document:Title'
, die die .
und Mittel fügt „auf dem aktuellen Knoten starten und den aktuellen Knoten suchen und alle Nachkommen“ .
Andere Tipps
Versuch
book_title_xpath = 'Title'