2012-02-14 11 views
6

Używam Nokogiri z Ruby do interpretowania zawartości pliku XML. Chciałbym uzyskać tablicy (lub podobne) wszystkich elementów, które są bezpośrednie dzieci <where> w moim przykładzie. Jednak otrzymuję różne węzły tekstowe (np. "\n\t\t\t"), których nie chcę. Czy istnieje sposób, w jaki mogę je usunąć lub zignorować?Pobieranie elementów elementu bez węzłów tekstowych

PowyŜsze Ruby wyjścia skryptu:

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

Chciałbym jakoś uzyskać następujący obiekt:

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

Obecnie mogę obejść ten problem używając

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

ale c.length == 5. Byłoby moje życie łatwiejsze, jeśli ktoś może sugerować, jak wykluczyć bezpośrednie węzły tekstowe dziecko od c, tak że c.length == 2

Odpowiedz

10

Ty (co najmniej) trzy opcje, z którego można wybrać:

  1. Korzystając c = where.element_children zamiast z c = where.children.

  2. tylko wybrane elementy podrzędne bezpośrednio:
    c = xml_request.xpath('./where/*') lub
    c = where.xpath('./*')

  3. Filtr lista dzieci do only those that are elements:
    c = where.children.select(&:element?)

+0

Dzięki. Opcja 2 wydaje się działać doskonale. – SimonMayer

Powiązane problemy