2012-08-24 34 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