与引入nokogiri
问题描述:
如何解析重复的元素我是新来引入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>
答
有几种方法可以做到这一点,这里有一个:
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
答
分配你的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"]]
谢谢,但如果我只是想从“方法”中获取名称/数据而不是“条件”或“事件”呢? – cLee 2011-06-05 21:50:13
Nevermind,doc.search(“method/data”)。each do | data | ...似乎工作。再次感谢 – cLee 2011-06-05 21:54:28