2013-08-22 86 views
0

我正在研究一个Sinatra应用程序,该应用程序通过XML文件提取日期列表,然后创建所有日期的散列。Ruby解析XML:不将字符串隐式转换为整数

我遇到了一个奇怪的问题,当我拉ID并将其分配给一个变量时发生。

我得到的错误是: 字符串的隐式转换成整数和它正在对event_date_id = event_date["date_id"]线抛出。我的代码中有几乎相同的方法,它工作得很好。当我puts event_date['date_id']它给了我正确的数字date_id。

以防万一它有帮助,event_date ['date_id']的类是REXMLUtiliyNodeString,与其他方法中的id字段相同。如果我尝试event_date['date_id'].to_i它在这一点上休息。

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> 

我有一种感觉,这是很简单的东西,但我令人头大我的脑子想弄明白。如果有人能够对此有所了解,我一定会很感激。

编辑1:当我在irb中运行代码时,它确实无误地工作。不知何故,似乎Sinatra,Rack或Shotgun正在阻碍其发展。

+0

我知道这不太有用,但它在我的机器上工作正常(Mac OS 10.8,ruby 2.0.0) – kristenmills

+0

感谢您的关注。我想这会让我的环境出问题! – chantron

回答

1

我找到了我的问题的原因。它只发生在我用一个日期/事件条目解析一个xml文件时。

这个question解释我正在做的确切问题,答案包括一个解决方案,为我工作。

if(!date_xml['document']['date'].is_a?(Array)) 
    date_xml['document']['date'] = [ date_xml['document']['date'] ] 
end 
0

当您尝试使用字符串索引查找数组中的值时,会出现此消息。

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>' 

由于磁盘阵列只能通过整数索引来访问,红宝石试图改变你的键名转换成整数,因为它不知道应该用什么数来表示任意字符串数据失败。因此消息“没有将字符串隐式转换为整数”。

如果您遇到这种情况,答案是修复您的代码,以便它不会像哈希一样访问数组。如果您从XML或JSON数据导入假设所需密钥始终存在并始终导入,但您仍然得到此信息,那么您的假设是错误的;数据未按预期格式化。修复数据或修复代码以处理不同的格式。