2012-03-30 65 views
3

我想在Ruby中使用Nori解析XML,它在内部使用Nokogiri。 的XML有一些标签重复和库解析重复的标签,数组和不重复的标签,正常的元素(散)如何保留XML Array中的顺序以进行哈希转换?

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

(这可能是一个图书馆的具体问题,但目的是为了知道是否有人已经遇到了类似的问题,以及如何正确地解析它)

+2

我没有看到期望的是什么输出将是。请记住,哈希值不能使用相同的键具有多个值。 – 2012-03-30 01:23:47

+0

更新的问题与预期的输出 – Sathish 2012-03-30 04:03:15

回答

1

海苔不能做到这一点对自己。你可以做的是调整紫菜输出是这样的:

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

我仍然会以这种方式丢失XML中的原始顺序。为了保留订单,我需要展开使用XML和散列 – Sathish 2012-03-30 17:53:51

+0

你能说更多关于你想要的订单吗?我发布的脚本会生成您请求的顺序(与XML文档中元素的顺序不同)。 – joelparkerhenderson 2012-03-30 19:47:48

+0

我在这个问题上犯了一个错误。我预计的订单是[foo1,bar1,baz1,foo2,bar2]。并且如果有一种方法可以保留订单而不用引用原来的xml – Sathish 2012-03-31 04:09:02