2016-04-04 3 views
1

Ich Nokogiri mit einigen XML zu analysieren, die Art wie folgt aussieht:Verwenden von XPath wählen Wurzel und Kinder Ausdruck übereinstimmen

<item name="item one"> 
    <other name="other name"/> 
    <third /> 
</item> 
<item name="item two"> 
    <other /> 
    <third /> 
</item> 

Ich bin über die Elemente Parsen Nokogiri mit etwa so:

xmldoc.xpath("//item").each do |node| 
    node.xpath("//*[@name]") # Gives me *all* elements in the doc 
    node.xpath(".//*[@name]") # Gives me child elements of the item 
end 

Welchen Ausdruck kann ich verwenden, um vom ersten Knoten zu erhalten, während ich durch iteriere?

+0

Bitte lesen "[MCVE]". Ihr XML ist nicht gültig und Ihr Quellcode wird nicht ausgeführt. Fordern Sie uns nicht auf, Code zu schreiben, nur um Ihren zu testen. –

Antwort

2

The . am Anfang würde den XPath-Ausdruck kontextspezifische machen, @ verwenden, um die Attribute zu bekommen, @* alle Attribute (Wildcard) zu erhalten:

node.xpath(".//*/@*") 
node.xpath("@*") 

Und immer alle Attribute des aktuellen Knotens sowie alle Attribute aller untergeordneten Knoten:

node.xpath(".//@*") 
+0

Gibt es einen Ausdruck, der beide Linien gleichzeitig ausführen würde? Ich möchte alle Attribute auf der Wurzel oder einem Kind. – karl

+0

@ karl aktualisiert, bitte testen. – alecxe

+0

Wie würde ich es ändern, um nur alle "Name" -Attribute zu erhalten (andere Attribute ignorierend)? – karl