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(',')