2012-02-14 8 views
6

Sto utilizzando Nokogiri con Ruby per interpretare il contenuto di un file XML. Mi piacerebbe avere un array (o simile) di tutti gli elementi che sono figli diretti di <where> nel mio esempio. Tuttavia, sto ottenendo vari nodi di testo (ad esempio "\n\t\t\t"), che non desidero. C'è un modo per rimuoverli o ignorarli?Ottenere figli di un elemento senza i nodi di testo

quanto sopra uscite script Ruby:

[#<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">]

vorrei ottenere qualche modo seguente oggetto:

[#<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">]>]

Attualmente mi può aggirare il problema utilizzando

c.each{|child| 
    if !child.text? 
    ... 
    end 
} 

ma c.length == 5. Sarebbe rendere la mia vita più facile se qualcuno può suggerire come escludere diretti nodi di testo bambino da c, in modo che c.length == 2

risposta

10

Hai (almeno) tre opzioni tra cui scegliere:

  1. Usa c = where.element_children invece di c = where.children.

  2. selezionare solo gli elementi figlio direttamente:
    c = xml_request.xpath('./where/*') o
    c = where.xpath('./*')

  3. filtrare l'elenco dei bambini per only those that are elements:
    c = where.children.select(&:element?)

+0

Grazie. L'opzione 2 sembra funzionare perfettamente. – SimonMayer

Problemi correlati