Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby解析XML:没有将字符串隐式转换为整数_Ruby_Sinatra - Fatal编程技术网

Ruby解析XML:没有将字符串隐式转换为整数

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

我正在开发一个Sinatra应用程序,它通过一个XML文件拉入一个日期列表,然后创建一个所有日期的散列

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

我得到的错误是: 没有将字符串隐式转换为整数,它被抛出到
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)上运行良好。感谢您的关注。我想这让我的环境出了问题!