2012-02-14 17 views
6

Estoy usando Nokogiri con Ruby para interpretar el contenido de un archivo XML. Me gustaría obtener una matriz (o similar) de todos los elementos que son hijos directos de <where> en mi ejemplo. Sin embargo, recibo varios nodos de texto (por ejemplo, "\n\t\t\t"), que no quiero. ¿Hay alguna manera de eliminarlos o ignorarlos?Obtener hijos de un elemento sin los nodos de texto

El anteriores salidas de guión 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">]

me gustaría obtener alguna manera el objeto siguiente:

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

Actualmente puedo evitar el problema utilizando

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

pero c.length == 5. Sería hacer mi vida más fácil si alguien puede sugerir cómo excluir los nodos de texto secundario directo de C, de manera que c.length == 2

Respuesta

10

que tiene (al menos) tres opciones entre las que elegir:

  1. Uso c = where.element_children vez de c = where.children.

  2. seleccionar sólo los elementos secundarios directamente:
    c = xml_request.xpath('./where/*') o
    c = where.xpath('./*')

  3. filtrar la lista de los niños a only those that are elements:
    c = where.children.select(&:element?)

+0

Gracias. La opción 2 parece estar funcionando perfectamente. – SimonMayer

Cuestiones relacionadas