2012-02-14 17 views
6

मैं रूबी के साथ Nokogiri उपयोग कर रहा हूँ एक एक्सएमएल फ़ाइल की सामग्री को व्याख्या करने के लिए बिना एक तत्व के बच्चों प्राप्त करें। मैं अपने उदाहरण में <where> के सभी बच्चों के सरणी (या समान) प्राप्त करना चाहता हूं। हालांकि, मुझे विभिन्न टेक्स्ट नोड्स मिल रहे हैं (उदा। "\n\t\t\t"), जो मैं नहीं चाहता हूं। क्या कोई तरीका है जिससे मैं उन्हें हटा या अनदेखा कर सकता हूं?पाठ नोड्स

उपरोक्त रूबी स्क्रिप्ट आउटपुट:

[#<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.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

संबंधित मुद्दे