Ruby解析XML:没有将字符串隐式转换为整数
我正在开发一个Sinatra应用程序,它通过一个XML文件拉入一个日期列表,然后创建一个所有日期的散列 当我提取id并将其分配给变量时,遇到了一个奇怪的问题 我得到的错误是: 没有将字符串隐式转换为整数,它被抛出到Ruby解析XML:没有将字符串隐式转换为整数,ruby,sinatra,Ruby,Sinatra,我正在开发一个Sinatra应用程序,它通过一个XML文件拉入一个日期列表,然后创建一个所有日期的散列 当我提取id并将其分配给变量时,遇到了一个奇怪的问题 我得到的错误是: 没有将字符串隐式转换为整数,它被抛出到event\u date\u id=event\u date[“date\u id”]行。我的代码中有几乎相同的方法,它工作得很好。当我放入事件日期['date\u id']时,它会给我正确的数字日期id 为了方便起见,event_date['date_id']的类是RexmlUtil
event\u date\u id=event\u date[“date\u id”]
行。我的代码中有几乎相同的方法,它工作得很好。当我放入事件日期['date\u id']
时,它会给我正确的数字日期id
为了方便起见,event_date['date_id']的类是RexmlUtilityNodeString,与另一个方法中的id字段相同。如果我尝试event\u date['date\u id'],则会在该点上中断
def get_dates(event_id)
url = "some_url_to_some_xml"
puts '==================='
puts "Pulling in #{url}"
puts '==================='
date_xml = Crack::XML.parse(open(url))
dates = {}
date_xml['document']['date'].each do | event_date |
event_date_id = event_date['date_id']
single_date = {
'date_id' => event_date_id,
'date_start' => event_date['datestart'],
'date_end' => event_date['dateend'],
'date_live' => event_date['live'],
'time_start' => event_date['timestart'],
'time_end' => event_date['timestart'],
'date_available' => event_date['date_available']
}
dates.merge!( event_date_id => single_date )
end
return dates
end
以下是xml格式:
<document>
<date>
<date_id>881908</date_id>
<live>y</live>
<datestart>2017-08-14</datestart>
<dateend>2017-08-15</dateend>
<timestart>13:00</timestart>
<timeend>0:00</timeend>
<date_available>10000</date_available>
</date>
<document>
881908
Y
2017-08-14
2017-08-15
13:00
0:00
10000
我觉得这很简单,但我绞尽脑汁想弄明白。如果有人能解释一下,我一定会很感激的
编辑1:当我在irb中运行代码时,它确实可以正常工作。不知何故,在某个地方,似乎Sinatra、Rack或Shotgun正在阻挠。我已经找到了问题的原因。它只在我解析带有日期/事件项的xml文件时发生
这解释了我遇到的确切问题,答案包括一个对我有用的解决方法
if(!date_xml['document']['date'].is_a?(Array))
date_xml['document']['date'] = [ date_xml['document']['date'] ]
end
当您尝试使用字符串索引查找数组中的值时,会出现此消息
2.0.0p353 :001 > results = [""]
=> [""]
2.0.0p353 :002 > results["x"]
TypeError: no implicit conversion of String into Integer
from (irb):2:in `[]'
from (irb):2
from /home/jeff/.rvm/rubies/ruby-2.0.0-p353/bin/irb:12:in `<main>'
2.0.0p353:001>结果=[“”]
=> [""]
2.0.0p353:002>结果[“x”]
TypeError:没有将字符串隐式转换为整数
from(irb):2:in`[]'
来自(irb):2
from/home/jeff/.rvm/rubies/ruby-2.0.0-p353/bin/irb:12:in`'
由于数组只能通过整数索引访问,Ruby试图将您的键名转换为整数,但由于不知道应该使用什么数字来表示任意字符串数据,因此失败了。因此出现了“字符串未隐式转换为整数”的消息
如果您遇到这种情况,答案是修复代码,使其不会像散列一样尝试访问数组。如果您从XML或JSON数据导入时假设所需的密钥始终存在并且将始终被导入,但您仍然得到了这一点,那么您的假设是错误的;数据未按预期格式化。要么修改数据,要么修改代码以处理不同的格式。我随机发现了这个问题的更好答案,尽管我非常缺乏经验,所以我认为它需要验证
我遇到了一个相同的问题,并发现大部分问题似乎是因为我返回了一个对象的数组,该数组有点混乱
在我的查询中添加“.first”之后,我就能够检索到我想要的属性
response = File.open('ncaa_bb_schedule.xml')
doc = Nokogiri::XML(response)
doc.remove_namespaces!
doc.xpath('//game').each do |game|
h = game.xpath('home').first
p h['id']
end
但是我的原始查询,显示在这里
response = File.open('ncaa_bb_schedule.xml')
doc = Nokogiri::XML(response)
doc.remove_namespaces!
doc.xpath('//game').each do |game|
h = game.xpath('home')
p h['id']
end
end
他给了我同样的错误:“TypeError:没有将字符串隐式转换为整数。”希望这对某人有所帮助,因为它比前面提到的解决方法要短得多。我知道这没有什么帮助,但它在我的机器(Mac OS 10.8,ruby 2.0.0)上运行良好。感谢您的关注。我想这让我的环境出了问题!