2012-03-30 1 views
3

내부적으로 Nokogiri를 사용하는 Nori를 사용하여 Ruby에서 XML을 구문 분석하려고합니다. XML은 어떤 태그 반복이 라이브러리 내가의 순서를 유지하려면 어떻게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"}}, 
    ]} 

은 (이 라이브러리 특정 질문 할 수있다. 그러나 의도는 사람이 비슷한 문제에 직면하고 올바르게 구문 분석하는 방법을 알고있다)

+2

내가 볼 수 없습니다 원하는 무엇 :

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 순서와 다른 원래의 질문 요청 출력을 인쇄 출력 될 것입니다. 해시는 동일한 키로 여러 값을 가질 수 없습니다. –

+0

예상 출력이있는 질문 업데이트 – Sathish

답변

1

노리 자체에이 작업을 수행 할 수 없습니다. 당신이 할 수있는 노리 출력과 같이 조정할 수 있습니다 :

{nodes: [ 
    {foo: {name: "a"}}, 
    {foo: {name: "d"}}, 
    {bar: {name: "b"}}, 
    {bar: {name: "e"}}, 
    {baz: {name: "c"}}, 
]} 
+0

XML에서 원래 순서대로 계속 손실됩니다. 순서를 유지하려면 xml과 해시를 모두 사용하여 펼쳐야합니다. – Sathish

+0

원하는 순서에 대해 더 자세히 말할 수 있습니까? 내가 게시 한 스크립트는 요청한 순서 (XML 문서의 요소 순서와 다름)를 생성합니다. – joelparkerhenderson

+0

질문에 실수를했습니다. 기대 한 순서는 [foo1, bar1, baz1, foo2, bar2]입니다. 원래 xml을 참조하지 않고 순서를 유지할 수있는 방법이 있다면 – Sathish