我正在尝试使用Nori解析Ruby中的XML,Nori内部使用Nokogiri。 XML重复了一些标记,并且库将重复的标记解析为Arrays,将非重复的标记解析为普通元素(Hash)
<nodes>
<foo>
<name>a</name>
</foo>
<bar>
<name>b</name>
</bar>
<baz>
<name>c</name>
</baz>
<foo>
<name>d</name>
</foo>
<bar>
<name>e</name>
</bar>
</nodes>
被解析为
{nodes: {
foo: [{name: "a"}, {name: "d"}],
bar: [{name: "b"}, {name: "e"}],
baz: {name: "c"}
}}
如何保留结果哈希中元素的顺序,如下面的输出?
{nodes: [
{foo: {name: "a"}},
{bar: {name: "b"}},
{baz: {name: "c"}},
{foo: {name: "d"}},
{bar: {name: "e"}},
]}
(这可能是图书馆特定的问题。但目的是要知道是否有人遇到类似问题以及如何正确解析它)
答案 0 :(得分:1)
Nori不能靠自己做到这一点。您可以做的是像这样调整Nori输出:
input = {nodes: {
foo: [{name: "a"}, {name: "d"}],
bar: [{name: "b"}, {name: "e"}],
baz: {name: "c"}
}}
def unfurl(hash)
out=[]
hash.each_pair{|k,v|
case v
when Array
v.each{|item|
out << {k => item}
}
else
out << {k => v}
end
}
return out
end
output = {:nodes => unfurl(input[:nodes])}
puts output.inspect
这将打印原始问题所请求的输出,该输出与XML顺序不同:
{nodes: [
{foo: {name: "a"}},
{foo: {name: "d"}},
{bar: {name: "b"}},
{bar: {name: "e"}},
{baz: {name: "c"}},
]}