如何保持XML Array中的顺序到Hash转换?

时间:2012-03-30 01:21:15

标签: ruby xml soap nokogiri savon

我正在尝试使用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"}},
    ]}

(这可能是图书馆特定的问题。但目的是要知道是否有人遇到类似问题以及如何正确解析它)

1 个答案:

答案 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"}},
]}