使用Ruby解析具有多个类似XML的标记的字符串

时间:2015-04-24 14:58:39

标签: ruby xml parsing nokogiri

我有一个如下所示的字符串:

   string = " <SET-TOPIC>INITIATE</SET-TOPIC>

    <SETPROFILE>
      <PROFILE-KEY>predicates_live</PROFILE-KEY>
      <PROFILE-VALUE>yes</PROFILE-VALUE>
    </SETPROFILE>

    <think>
      <set><name>first_time_initiate</name>yes</set>
    </think>

    <SETPROFILE>
      <PROFILE-KEY>first_time_initiate</PROFILE-KEY>
      <PROFILE-VALUE>YES</PROFILE-VALUE>
    </SETPROFILE>"

我的目标是能够通过解析读出每个顶级。我使用case语句来评估什么是顶级键,例如<SETPROFILE>但是可以有许多不同的值,然后运行一个方法,使用标记的contnt执行不同的操作。

这意味着我需要能够非常轻松地知道:

  • top_level_keys = ['SET-TOPIC', 'SET-PROFILE', 'SET-PROFILE']
  • 当我传入密钥时知道全部值
  • parsed[0].value = {:PROFILE-KEY => predicates_live, :PROFILE-VALUE => yes}
  • parsed[0].key = ['SET-TOPIC']

我目前正在解析整个字符串,如下所示:

doc = Nokogiri::XML::DocumentFragment.parse(string)
parsed = doc.search('*').each_with_object({}){ |n, h|
  h[n.name] = n.text
}

结果,我只解析并知道第二个标签。第一个标记中的值未显示在parsed变量中。

我可以控制标签是什么,如果有帮助的话。

但是我需要能够解析并知道两个标记的内容作为解析的结果,因为我需要为节点的每个实例应用一个方法。

注意:该字符串在XML类标记之前,之间和之后都只包含常规文本。

1 个答案:

答案 0 :(得分:0)

这取决于你将要实现的目标。问题是您要按新值覆盖哈希键。收集值的最简单方法是将它们存储在数组中:

parsed = doc.search('*').each_with_object({}) do |n, h| 
  # h[n.name] = n.text :: removed because it overrides values
  (h[n.name] ||= []) << n.text 
end