1

This is a simple stuff but driving me really crazy now. Spent hours on figuring this out which I have many many times before.

I am trying to read a parse xmlsimple doc. But I don't know why can't access elements by index number. I can't understand the problem, when I try this in the console it works, but not in actual code. It gives me this error on the view page:

undefined method `[]' for nil:NilClass

Code:

@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

If I do it by giving a int value manually in my code then it works:

a = parsed_items["Item"][0]["ItemId"] # it works with other exact code

Change to @i and not working:

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

言い換えれば、そのエラーは「ねえ、あなたは[]何かの後ろに置いたがnilnilそのメソッドを持っていない!」という意味です。

@i配列には2 つの項目しかないため、2<strong>0 から始まるリストの 3 番目の項目に到達すると、コードは;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 に答える