1

这是一个简单的东西,但现在让我真的发疯了。花了几个小时来解决这个问题,我以前有很多次。

我正在尝试阅读解析 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>
4

2 回答 2

2

解释一下,那个错误的意思是“嘿,你放[]了一些东西nil,但nil没有那个方法!”

您的数组中只有 2 个项目,因此当@i到达2-<strong> 这是基于 0 的列表中的第三个项目时,代码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

更好的改变(让 Ruby 为你做你的工作):

puts parsed_items["Item"].map{ |item| item["ItemId"] }.join(',')
于 2012-04-19T18:17:10.643 回答
0

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

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

我强烈建议您阅读不同的变量类型

于 2012-04-19T18:15:25.967 回答