【问题标题】:How to retain order in XML Array to Hash conversion?如何保留 XML Array 到 Hash 转换中的顺序?
【发布时间】:2012-04-01 01:04:46
【问题描述】:

我正在尝试使用 Nori 解析 Ruby 中的 XML,Nori 在内部使用 Nokogiri。 XML 有一些重复的标签,库将重复的标签解析为数组,将非重复的标签解析为普通元素(哈希)

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

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

【问题讨论】:

  • 我看不到想要的输出是什么。请记住,哈希不能有多个具有相同键的值。
  • 更新了预期输出的问题

标签: ruby xml soap nokogiri savon


【解决方案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"}},
]}

【讨论】:

  • 我仍然会以这种方式丢失 XML 中的原始订单。要保留订单,我需要同时使用 xml 和哈希展开
  • 你能说更多关于你想要的顺序吗?我发布的脚本会生成您请求的顺序(与 XML 文档中元素的顺序不同)。
  • 我在问题中犯了一个错误。我期望的顺序是 [foo1, bar1, baz1, foo2, bar2]。如果有办法保留订单而不参考原始 xml
猜你喜欢
  • 2012-09-21
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 2016-04-16
  • 2020-12-21
  • 2017-02-24
  • 2012-06-02
相关资源
最近更新 更多