我有一个如下所示的字符串:
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类标记之前,之间和之后都只包含常规文本。
答案 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