2011-06-05 105 views
2

如何解析重复的元素我是新来引入nokogiri,让我怎么解析“数据”,它在下面的XML是文本,以及 “姓名”,从“方法”:与引入nokogiri

<get_escalators_response status="200" status_text="OK"> 
<escalator id="6181e65d-8ba0-4937-9c44-8f2b10b0def7"> 
<name>Team alert</name> 
<comment/> 
<in_use>1</in_use> 
<condition> 
    Threat level at least 
    <data> 
    High 
    <name>level</name> 
    </data> 
</condition> 
<event> 
    Task run status changed 
    <data> 
    Done 
    <name>status</name> 
    </data> 
</event> 
<method> 
    Email 
    <data> 
    [email protected] 
    <name>to_address</name> 
    </data> 
    <data> 
    [email protected] 
    <name>from_address</name> 
    </data> 
    <data> 
    0 
    <name>notice</name> 
    </data> 
</method> 
</escalator> 
... 
</get_escalators_response> 

回答

0

有几种方法可以做到这一点,这里有一个:

doc = Nokogiri::XML("your_xml_document") 
doc.search("data").each do |data| 
    name = data.search("name").remove # remove the name element from data element 
    name_text = name.text 
    data_text = data.text 
    # do stuff with text 
end 

您可以搜索特定的嵌套的元素是这样的:

doc.search("method > data").each do |data| 
    # do stuff 
end 
+0

谢谢,但如果我只是想从“方法”中获取名称/数据而不是“条件”或“事件”呢? – cLee 2011-06-05 21:50:13

+0

Nevermind,doc.search(“method/data”)。each do | data | ...似乎工作。再次感谢 – cLee 2011-06-05 21:54:28

1

分配你的XML到一个名为xml变量,我会去了解它是这样的:

require 'nokogiri' 
require 'pp' 

doc = Nokogiri::XML(xml) 
pp doc.search('//method/data').map{ |n| n.text.scan(/\S+/) } 

请注意这是返回数组的数组。将数据强制转换为字符串或哈希值很容易。

# >> [["[email protected]", "to_address"], 
# >> ["[email protected]", "from_address"], 
# >> ["0", "notice"]]