0

我正在开发一个 Sinatra 应用程序,该应用程序通过 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 似乎在阻碍。

4

3 回答 3

1

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

这个问题解释了我遇到的确切问题,答案包括对我有用的解决方法。

if(!date_xml['document']['date'].is_a?(Array))
  date_xml['document']['date'] = [ date_xml['document']['date'] ]
end
于 2013-08-24T00:46:39.517 回答
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 尝试将您的键名转换为整数,但失败了,因为它不知道应该使用什么数字来表示任意字符串数据。因此消息“没有将字符串隐式转换为整数”。

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

于 2013-12-05T11:32:24.020 回答
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:没有将字符串隐式转换为整数。” 希望对某人有所帮助,因为它比上述解决方法要短得多。

于 2018-11-26T20:14:38.090 回答