这是代码:
xml = REXML::Document.new(data)
@contacts = Array.new
xml.elements.each('//entry') do |entry|
person = {}
person['name'] = entry.elements['title'].text
gd_email = entry.elements['gd:email']
person['email'] = gd_email.attributes['address'] if gd_email
@contacts << person
end
@contacts.sort_by { |k| k['name'] } if @contacts[0].size > 0
错误:
You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.<=>
答案 0 :(得分:3)
最后一行不应该是
@contacts.sort_by { |k| k['name'] } if @contacts.size > 0
不是@contacts[0].size
?
另外,请尝试在排序前添加@contacts.compact!
,以确保数组中没有nil
值。
答案 1 :(得分:3)
尝试使用:
person['name'] = entry.elements['title'].text || ''
而不是:
person['name'] = entry.elements['title'].text
答案 2 :(得分:0)
我认为您可以简化您的代码:
@contacts = Array.new
xml = REXML::Document.new(data)
xml.elements.each('//entry') do |entry|
gd_email = entry.elements['gd:email']
@contacts << {
'name' => entry.elements['title'].text,
'email' => (gd_email) ? gd_email.attributes['address'] : ''
}
end
@contacts.sort_by! { |k| k['name'] }
我没有您的XML样本来测试它,但它看起来应该可以工作。
如果element['title']
为空,您将收到您所看到的错误,因此您需要跳过这些元素或使用名称字段的默认值,例如“unknown”。