2012-02-14 27 views
6

Tôi đang sử dụng Nokogiri với Ruby để giải thích nội dung của tệp XML. Tôi muốn nhận được một mảng (hoặc tương tự) của tất cả các phần tử là con trực tiếp của <where> trong ví dụ của tôi. Tuy nhiên, tôi nhận được các nút văn bản khác nhau (ví dụ: "\n\t\t\t"), mà tôi không muốn. Có cách nào tôi có thể loại bỏ hoặc bỏ qua chúng?Lấy con của một phần tử không có các nút văn bản

Ở trên kết quả đầu ra kịch bả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">]

Tôi muốn bằng cách nào đó có được các đối tượng sau đây:

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

Hiện nay tôi có thể làm việc xung quanh vấn đề sử dụng

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

nhưng c.length == 5. Nó sẽ làm cho cuộc sống của tôi dễ dàng hơn nếu ai đó có thể cho thấy làm thế nào để loại trừ các nút văn bản con trực tiếp từ c, do đó c.length == 2

Trả lời

10

Bạn đã (ít nhất) ba tùy chọn để lựa chọn:

  1. Sử dụng c = where.element_children thay của c = where.children.

  2. Chọn chỉ các yếu tố con trực tiếp:
    c = xml_request.xpath('./where/*') hoặc
    c = where.xpath('./*')

  3. Lọc danh sách các trẻ em để only those that are elements:
    c = where.children.select(&:element?)

+0

Cảm ơn. Tùy chọn 2 dường như hoạt động hoàn hảo. – SimonMayer

Các vấn đề liên quan