1

私はXmlSimpleを使用していますが、私が抱えている問題は、エントリのリストを解析し、同様のxmlタグを持つエントリの数を決定することです。

<ItemList>
   <Item>
      <ItemId>123</ItemId>
      <ItemName>abc</ItemName>
      <ItemType>xyz</ItemType>
      <Status>ok</Status>
   </Item>
</ItemList>

上記はこのように解析されます-

"ItemList"=> { 
    "Item"=>{ "ItemId"=>"123", 
              "ItemName"=>"abc", 
              "ItemType"=>"xyz", 
              "Status"=>"ok"
             }
},

そして、私はそれにアクセスします- ['ItemList']['Item']['ItemId']、どこにもインデックス番号なしで。

しかし、ItemListに1つ以上のエントリがある場合、それは私のアプリケーションを台無しにします。

<ItemList>
   <Item>
      <ItemId>123</ItemId>
      <ItemName>abc</ItemName>
      <ItemType>xyz</ItemType>
      <Status>bad</Status>
   </Item>
   <Item>
      <ItemId>456</ItemId>
      <ItemName>fgh</ItemName>
      <ItemType>nbv</ItemType>
      <Status>bad</Status>
   </Item>
</ItemList>

上記はこのように解析されます-

"ItemList"=> { 
    "Item"=>{ "ItemId"=>"123", 
              "ItemName"=>"abc", 
              "ItemType"=>"xyz", 
              "Status"=>"bad"
             },
    "Item"=>{ "ItemId"=>"456", 
              "ItemName"=>"fgh", 
              "ItemType"=>"nbv", 
              "Status"=>"bad"
             }
},

['ItemList']['Item'][0]['ItemId']-およびとしてアクセスできます['ItemList']['Item'][1]['ItemId']。インデックス番号を手動で提供します。ただし、リストにアイテムがいくつあるかわからないため、実際のアプリではインデックス番号を指定できないため、xmlにエントリがないか、数百のアイテムが含まれている可能性があります。のこぎりを使うことを考えましたが、同じ構文解析動作をします。これをどのように処理しますか?

4

3 に答える 3

1

xml-simplegemを使用したデータのサンプル処理

1.9.2p290 :013 > items = "<ItemList> <Item> <ItemId>123</ItemId> <ItemName>abc</ItemName> <ItemType>xyz</ItemType> <Status>bad</Status> </Item> <Item> <ItemId>456</ItemId> <ItemName>fgh</ItemName> <ItemType>nbv</ItemType> <Status>bad</Status> </Item> </ItemList>"
     => "<ItemList> <Item> <ItemId>123</ItemId> <ItemName>abc</ItemName> <ItemType>xyz</ItemType> <Status>bad</Status> </Item> <Item> <ItemId>456</ItemId> <ItemName>fgh</ItemName> <ItemType>nbv</ItemType> <Status>bad</Status> </Item> </ItemList>" 

1.9.2p290 :014 > parsed_items = XmlSimple.xml_in(items, { 'KeyAttr' => 'name' })
     => {"Item"=>[{"ItemId"=>["123"], "ItemName"=>["abc"], "ItemType"=>["xyz"], "Status"=>["bad"]}, {"ItemId"=>["456"], "ItemName"=>["fgh"], "ItemType"=>["nbv"], "Status"=>["bad"]}]} 

1.9.2p290 :015 > parsed_items.class
     => Hash 

1.9.2p290 :016 > parsed_items["Item"].class
     => Array 

1.9.2p290 :017 > parsed_items["Item"].length
     => 2 

したがって、あなたItemは配列になり、それにlengthメソッドを適用できます。上記の私の例では、いつでも行うことができますparsed_items["Item"].length

于 2012-04-18T11:11:15.503 に答える
0

'result'がXMLドキュメントの解析から得られるものである場合は、テストできます

result['ItemList']['Item']

配列(または列挙可能)かどうかを確認します。そうである場合は、複数のアイテムがあり、アイテムを列挙する必要があります。

または、これを行うこともできます(ruby 1.9を想定)。

[*result['ItemList']['Item']].each do |item|
   ...
end

splat演算子は優れており、このように使用すると、nil、スカラー、またはコレクションの値を透過的に処理できます。

于 2012-04-18T04:56:36.807 に答える
0

Ruby 1.8以降を使用している場合は、これを簡単にするREXMLを使用します。「要素へのアクセス」セクションを参照してください:http://www.germane-software.com/software/rexml/docs/tutorial.html

于 2012-04-18T05:34:19.253 に答える