2013-08-22 117 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數據導入假設所需密鑰始終存在並始終導入,但您仍然得到此信息,那麼您的假設是錯誤的;數據未按預期格式化。修復數據或修復代碼以處理不同的格式。