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

Gag*_*gan 1 ruby xml ruby-on-rails libxml-ruby xml-parsing

我正在使用 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>
Run Code Online (Sandbox Code Playgroud)

我如何从这个 xml 字符串中获取 api_key、同步令牌、last_synchronize_on 值?

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

谢谢

mu *_*ort 5

您将使用LibXML::XML::Parser来获取LibXML::XML::Document

p = LibXML::XML::Parser.file(xml_file)
# or p = LibXML::XML::Parser.string(xml_string)
doc = p.parse
Run Code Online (Sandbox Code Playgroud)

然后使用find和一些 XPath 来查找您的节点:

api_key_node = doc.find('//api_key').first
Run Code Online (Sandbox Code Playgroud)

这会给你一个输入LibXML::XML::Nodeapi_key_node这样你就可以打电话content来得到你想要的东西:

api_key = api_key_node.content
# "252f5df2df522fg5fd25df2df5df2fd5"
Run Code Online (Sandbox Code Playgroud)

类似的事情适用于同步,但你会[]用来访问属性值:

sync      = doc.find('//synchronization').first
token     = sync['token']
last_sync = sync['last_syncrhonize_on']
Run Code Online (Sandbox Code Playgroud)

<blocking>节点再次进行相同的处理,但您将使用each而不是使用first.