2012-04-19 176 views
1

這是一個簡單的東西,但現在讓我真的很瘋狂。花了幾個小時來弄清楚我以前有很多次。解析並讀取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> 

回答

2

解釋,那個錯誤意味着「嘿,你把[]放在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(',') 
0

對於您定義的實例變量,而不是一個地方一個某種原因。將列表轉換爲字符串也是完全不必要的,因爲它從一開始就是一個字符串。工作代碼應該看起來有點像這樣:

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

我強烈建議您到read about different variable types