2011-09-04 73 views
0

我正在使用libxml-ruby gem來讀取xml字符串。libxml-ruby解析文件並從xml中獲取所需信息

我無法從xml字符串中提取所需的信息。

目前,我有以下XML

<?xml version="1.0" encoding="utf-8"?> 
<message> 
    <head> 
    <api_key>252f5df2df522fg5fd25df2df5df2fd5</api_key> 
    <user>123</user> 
    <secret>********************</secret> 
    <signature>****************</signature> 
    <synchronization token="kj0s09ew090mv904v09409905b" last_synchronize_on="2010-01-02 11:30" /> 
    </head> 
    <blockings> 
    <blocking token="AAA" start_time="2010-01-01 10:00" end_time="2010-01-01 12:00" method="REQUEST" is_forced="FALSE" /> 
    <blocking token="BBB" start_time="2010-01-03 15:00" end_time="2010-01-03 18:00" method="REQUEST" is_forced="FALSE" /> 
    </blockings> 
</message> 

我如何獲得API_KEY,同步令牌,last_synchronize_on值從這個XML字符串?

如何獲取此字符串的阻塞節點內的阻塞節點的信息?

感謝

回答

4

你會使用LibXML::XML::Parser得到LibXML::XML::Document

p = LibXML::XML::Parser.file(xml_file) 
# or p = LibXML::XML::Parser.string(xml_string) 
doc = p.parse 

然後用find和一點的XPath找到你的節點:

api_key_node = doc.find('//api_key').first 

這就給了你一個LibXML::XML::Nodeapi_key_node所以你可以打電話content得到你想要的:

api_key = api_key_node.content 
# "252f5df2df522fg5fd25df2df5df2fd5" 

類似的事情適用於同步,但你會使用[]訪問屬性值:再次

sync  = doc.find('//synchronization').first 
token  = sync['token'] 
last_sync = sync['last_syncrhonize_on'] 

同樣的協議爲<blocking>節點,但是你通過他們用each重複使用的,而不是first