2012-04-19 2 views
1

이것은 간단한 것이지만 지금은 나를 미치게 만듭니다. 나가 많은 시간을 전에 가지고있는 이것을 알아 내기에 소요 된 시간.xml 배열을 구문 분석하고 읽음

구문 분석 xmlsimple doc을 읽으려고합니다. 하지만 인덱스 번호별로 요소에 액세스 할 수없는 이유를 모르겠습니다. 내가 문제를 이해할 수 없다, 콘솔에서 이것을 시도 할 때 작동하지만 실제 코드에서는 작동하지 않는다.

undefined method `[]' for nil:NilClass 

코드 : : 내 코드에서 수동으로 int 값을 제공함으로써 그것을 할 경우

@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 

다음 작동 :

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 가져 그렇게 할 때, 배열에이 개 항목이

- 0 기반 목록parse_items["Item"][@i]nil을 반환 년 - 코드에서 세 번째 항목 인 ; 그 값에 ["ItemId"]을 실행하려고하면 명시한 오류가 발생합니다.

간단한 변화는이 문제를 해결하려면 :

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(',') 
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을 제안합니다.

관련 문제