2012-02-14 6 views
6

Я использую Nokogiri с Ruby для интерпретации содержимого XML-файла. Я хотел бы получить массив (или аналогичный) всех элементов, которые являются прямыми дочерними элементами <where> в моем примере. Тем не менее, я получаю различные текстовые узлы (например, "\n\t\t\t"), чего я не хочу. Есть ли способ удалить или игнорировать их?Получить дочерние элементы элемента без текстовых узлов

Вышеуказанные выходы сценария 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">]

Я хотел бы, чтобы каким-то образом получить следующий объект:

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

В настоящее время я могу работать вокруг вопроса с использованием

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

но c.length == 5. Это сделало бы мою жизнь легче, если кто-то может предложить, как исключить прямые дочерние текстовые узлы из C, так что c.length == 2

ответ

10

Вы (по крайней мере) три варианта, из которых нужно выбрать:

  1. Использование c = where.element_children вместо от c = where.children.

  2. Выберите только дочерние элементы непосредственно:
    c = xml_request.xpath('./where/*') или
    c = where.xpath('./*')

  3. Фильтр список детей only those that are elements:
    c = where.children.select(&:element?)

+0

Спасибо. Вариант 2 работает отлично. – SimonMayer

Смежные вопросы