libxml-ruby解析文件并从xml获取所需的信息

时间:2011-09-04 05:24:31

标签: ruby-on-rails ruby xml xml-parsing libxml-ruby

我使用libxml-ruby gem来读取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>

如何从此xml字符串中获取api_key,同步令牌,last_synchronize_on值?

如何获取此字符串的阻塞节点内的阻塞节点的信息?

由于

1 个答案:

答案 0 :(得分: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

这会在api_key_node中为您提供LibXML::XML::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进行迭代。