Как сохранить порядок в преобразовании XML Array в Hash? - PullRequest
3 голосов
/ 30 марта 2012

Я пытаюсь проанализировать XML в Ruby, используя 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"}},
    ]}

(Это может быть специфический для библиотеки вопрос. Но мы хотим знать, сталкивался ли кто-либо с подобной проблемой, и как правильно ее анализировать).) * +1010 *

1 Ответ

1 голос
/ 30 марта 2012

Нори не может сделать это самостоятельно.Что вы можете сделать, так это настроить вывод 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"}},
]}
...