Ruby解析XML:没有将String隐式转换为Integer

时间:2013-08-22 23:15:22

标签: ruby sinatra

我正在研究一个Sinatra应用程序,该应用程序通过XML文件提取日期列表,然后创建所有日期的哈希值。

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

我得到的错误是: 没有将String隐式转换为整数,并且它被抛出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正在阻碍它。

3 个答案:

答案 0 :(得分:1)

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

question解释了我遇到的确切问题,答案包括一个适用于我的工作。

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

答案 1 :(得分: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>'

由于数组只能通过整数索引访问,因此Ruby会尝试将您的密钥名称转换为整数,并失败,因为它不知道应该使用哪个数字来表示任意字符串数据。因此消息“没有将String隐式转换为整数”。

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

答案 2 :(得分:0)

尽管我经验不足,但是我偶然发现了对这个问题可能是更好的答案,因此我认为需要进行验证。

我遇到一个相同的问题,并且看到很多麻烦似乎是因为我返回了一个有点混乱的一个对象数组

在查询中添加“ .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:没有将String隐式转换为Integer。”希望对您有所帮助,因为它比上述解决方法要短得多。