解析并读取xml数组
问题描述:
这是一个简单的东西,但现在让我真的很疯狂。花了几个小时来弄清楚我以前有很多次。解析并读取xml数组
我正在尝试阅读解析xmlsimple文档。但我不知道为什么不能通过索引号访问元素。我无法理解这个问题,当我在控制台中使用它的时候,但在实际的代码中没有这样做。它给了我这个错误的观点页:
undefined method `[]' for nil:NilClass
代码:
@i = 0
list =""
while @i <= 2
puts xml
a = parsed_items["Item"][@i]["ItemId"]
list << a.to_s << ","
@i += 1
end
puts list.to_s
如果我在我的代码手动给人int值做到这一点,然后它的工作原理:
a = parsed_items["Item"][0]["ItemId"] # it works with other exact code
更改为@i
而不工作:
a = parsed_items["Item"][@i]["ItemId"] # it does not work with other exact code
XML:
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"]}]}
XML:
<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>
答
解释,那个错误意味着“嘿,你把[]
放在nil
之后,但是nil
没有这个方法!”
你只有2项数组中,所以当@i
到达2
- 这是基于0的列表 -the代码parse_items["Item"][@i]
将返回nil
第三项;当您尝试对该值执行["ItemId"]
时,您会看到您陈述的错误。
最简单的变化解决这个问题:
while @i<2 # instead of <=2
更好地改变了(让Ruby的迭代你):
list = ""
parsed_items["Item"].each do |item|
list << item["ItemId"].to_s << ","
end
puts list
更妙的变化(让红宝石做你的工作你):
puts parsed_items["Item"].map{ |item| item["ItemId"] }.join(',')
答
对于您定义的实例变量,而不是一个地方一个某种原因。将列表转换为字符串也是完全不必要的,因为它从一开始就是一个字符串。工作代码应该看起来有点像这样:
i = 0
list =""
while i <= 2
puts xml
a = parsed_items["Item"][i]["ItemId"]
list << a.to_s << ","
i += 1
end
puts list