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 可能没有条目或可能有数百个条目。想过使用 Nokogiri,但它具有相同的解析行为。我该如何处理?

4

3 回答 3

1

xml-simple使用gem对数据进行样本处理

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

如果“结果”是您从解析 XML 文档中得到的,那么您可以测试

result['ItemList']['Item']

检查它是否是一个数组(或可枚举的)。如果是,那么就有超过 1 个项目,您必须枚举这些项目。

或者,您可以这样做(假设 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 回答