2012-08-24 32 views
2

创建我有以下XML通过XML循环,从而在Ruby中

<CallResult> 
    <Success>true</Success> 
    <Result> 
    <ZoneInfo> 
     <Id>3</Id> 
     <Name>test-room</Name> 
     <NId>sdfsdg</NId> 
    </ZoneInfo> 
    <ZoneInfo> 
     <Id>16</Id> 
     <Name>Dynamic</Name> 
     <NId>sadadrwed543th</NId> 
    </ZoneInfo> 
    <ZoneInfo> 
     <Id>32</Id> 
     <Name>lobby</Name> 
     <NId>ssdfrgfdfg</NId> 
    </ZoneInfo> 
    <ZoneInfo> 
     <Id>33</Id> 
     <Name>conf</Name> 
     <NId>sdfsfewr232f</NId> 
    </ZoneInfo> 
    </Result> 
    <Message>Success</Message> 
</CallResult> 

我试图解析XML使每个不同的“时区信息”属性是在数组中的哈希散列的数组。

E.g.

区[0] =散列[ID => 32,名称=>大堂,NID => ssdfrgfdfg]

区域[1] =散列[ID => 33,名称=> CONF,NID => sdfsfewr232f] etc ...

我有限的XML解析知识已经成为一个croper。我真正知道的是如何提取单个元素。例如。

doc = REXML::Document.new(xmlData) 
doc.elements.each("CallResult/Success") do |ele| 
    p ele.text; 
end 

有人可以帮助一些关于如何通过从每个'ZoneInfo'元素提取信息循环?

感谢

回答

1

我用另一颗宝石 '引入nokogiri',也许是最好的宝石,现在来解析HTML/XML。

require 'nokogiri' 

str = "<CallResult> ......" 
doc = Nokogiri.XML(str) 
Zones = [] 
doc.xpath('//ZoneInfo').each do |zone| 
    Zones << { "Id" => zone.xpath('Id').text, "Name" => zone.xpath('Name').text, "NId" => zone.xpath("NId").text} 
end 
+0

工作一种享受。谢谢! – user1074981

2

你只需要使用紫菜宝石

require 'nori' 
your_hash = Nori.parse(your_xml) 

,然后如果你需要存储数据这样,它应该很容易此嵌套哈希转换成散列的数组。

如果您需要更多的信息,API文档是在这里 - http://rubydoc.info/gems/nori/1.1.3/frames