Holen Sie sich die Kinder eines Elements ohne den text-Knoten
Ich bin mit Nokogiri mit Ruby interpretieren den Inhalt einer XML-Datei. Ich würde gerne ein array (oder ähnlich) von allen Elementen, die direkte Kinder von <where>
in meinem Beispiel. Allerdings bin ich immer verschiedene text-Knoten (z.B. "\n\t\t\t"
), was ich nicht will. Gibt es eine Möglichkeit, ich kann Sie entfernen oder ignorieren Sie Sie?
@body = "
<xml>
<request>
<where>
<username compare='e'>Admin</username>
<rank compare='gt'>5</rank>
</where>
</request>
</xml>" #in my code, the XML contains tab-indentation, rather than spaces. It is edited here for display purposes.
@noko = Nokogiri::XML(@body)
xml_request = @noko.xpath("//xml/request")
where = xml_request.xpath("where")
c = where.children
p c
Den oben genannten Ruby-Skript:
[#<Nokogiri::XML::Text:0x100344c "\n\t\t\t">, #<Nokogiri::XML::Element:0x1003350 name="username" attributes=[#<Nokogiri::XML::Attr:0x10032fc name="compare" value="e">] children=[#<Nokogiri::XML::Text:0x1007580 "Admin">]>, #<Nokogiri::XML::Text:0x100734c "\n\t\t\t">, #<Nokogiri::XML::Element:0x100722c name="rank" attributes=[#<Nokogiri::XML::Attr:0x10071d8 name="compare" value="gt">] children=[#<Nokogiri::XML::Text:0x1006cec "5">]>, #<Nokogiri::XML::Text:0x10068a8 "\n\t\t">]
Ich würde gerne irgendwie erhalten Sie das folgende Objekt:
[#<Nokogiri::XML::Element:0x1003350 name="username" attributes=[#<Nokogiri::XML::Attr:0x10032fc name="compare" value="e">] children=[#<Nokogiri::XML::Text:0x1007580 "Admin">]>, #Nokogiri::XML::Element:0x100722c name="rank" attributes=[#<Nokogiri::XML::Attr:0x10071d8 name="compare" value="gt">] children=[#<Nokogiri::XML::Text:0x1006cec "5">]>]
Derzeit kann ich das Problem umgehen, mithilfe
c.each{|child|
if !child.text?
...
end
}
aber c.length == 5
. Es würde mein Leben einfacher ist, wenn jemand vorschlagen kann, so schließen Sie direkt untergeordneten text-nodes aus c, so dass c.length == 2
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie (mindestens) drei Optionen, von denen wählen:
Verwenden
c = wo.element_children
stattc = where.children
.Wählen Sie nur die untergeordneten Elemente direkt:
c = xml_request.xpath('./where/*')
oderc = where.xpath('./*')
Filtern Sie die Liste der Kinder zu nur die Elemente:
c = where.children.select(&:element?)