Ruby 解析和读取xml数组

Ruby 解析和读取xml数组,ruby,xml,Ruby,Xml,这是一个简单的东西,但现在真的让我发疯了。我花了好几个小时来搞清楚这一点,我以前也做过很多次 我正在尝试阅读一个简单的文档。但我不知道为什么不能按索引号访问元素。我无法理解这个问题,当我在控制台中尝试时,它可以工作,但在实际代码中不起作用。它在“查看”页面上显示以下错误: undefined method `[]' for nil:NilClass 代码: 更改为@i且不工作: a = parsed_items["Item"][@i]["ItemId"] # it does not work

这是一个简单的东西,但现在真的让我发疯了。我花了好几个小时来搞清楚这一点,我以前也做过很多次

我正在尝试阅读一个简单的文档。但我不知道为什么不能按索引号访问元素。我无法理解这个问题,当我在控制台中尝试时,它可以工作,但在实际代码中不起作用。它在“查看”页面上显示以下错误:

undefined method `[]' for nil:NilClass
代码:

更改为
@i
且不工作:

a = parsed_items["Item"][@i]["ItemId"] # it does not work with other exact code
XML:

1.9.2p290:013>items=“123 abc xyz坏456 fgh nbv坏”
=>“123 abc xyz坏456 fgh nbv坏”
1.9.2p290:014>解析的\u items=XmlSimple.xml\u in(items,{'KeyAttr'=>'name'})
=>{“Item”=>[{“ItemId”=>[“123”],“ItemName”=>[“abc”],“ItemType”=>[“xyz”],“Status”=>[“bad”]},{“ItemId”=>[“456”],“ItemName”=>[“fgh”],“ItemType”=>[“nbv”],“Status”=>[“bad”}
XML:


123
abc
xyz
坏的
456
fgh
nbv
坏的

出于某种原因,您正在定义一个实例变量,而不是本地变量。此外,将列表转换为字符串完全没有必要,因为它从一开始就是一个字符串。工作代码应该有点像这样:

i = 0
list =""
while i <= 2
  puts xml
  a = parsed_items["Item"][i]["ItemId"]
  list <<  a.to_s << ","
  i += 1
end
puts list
i=0
list=“”

当我解释时,这个错误意味着“嘿,你把
[]
放在
nil
后面,但是
nil
没有这个方法!”

数组中只有2个项目,因此当
@i
到达
2
-时,这是基于0的列表中的第三个项目——代码
解析项目[“项目”][@i]
将返回
nil
;然后,当您尝试对该值执行
[“ItemId”]
时,您会得到您声明的错误

最简单的更改解决此问题:

while @i<2 # instead of <=2
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"]}]} 
i = 0
list =""
while i <= 2
  puts xml
  a = parsed_items["Item"][i]["ItemId"]
  list <<  a.to_s << ","
  i += 1
end
puts list
while @i<2 # instead of <=2
list = ""
parsed_items["Item"].each do |item|
  list << item["ItemId"].to_s << ","
end
puts list
puts parsed_items["Item"].map{ |item| item["ItemId"] }.join(',')