2015-04-01 56 views
0

我正在嘗試生成XML,但循環沒有中斷。下面是代碼的一部分:XML生成器中的Foreach循環不會中斷

@key = 0 
@cont.each do |pr| 
    xml.product { 
    @key += 1 
    puts @key.to_s 
    begin 
     @main = Nokogiri::HTML(open(@url+pr['href'], "User-Agent" => "Ruby/#{RUBY_VERSION}","From" => "[email protected]", "Referer" => "http://www.ruby-lang.org/")) 
    rescue 
     puts "rescue" 
     next 
    end 
    puts pr['href'] 
    puts @key.to_s 
    break //this break doesn't work 
    #something else 
    } 
end 

最有意思的是,最終生成的XML文件中,break工作。該文件只包含一個產品,但在控制檯@key上打印完畢,這意味着foreach循環不會中斷。

難道這是一個Nokogiri XML特定的錯誤,因爲在循環的開頭括號?

+0

首先,初始化'@ url',其次是'@ cont'中包含的內容? – 2015-04-01 10:47:29

+0

「尋求調試幫助的問題(」爲什麼這個代碼不工作?「)必須包含所需的行爲,特定的問題或錯誤以及在問題本身中重現問題所需的最短代碼。對其他讀者很有用,參見:[如何創建一個最小,完整和可驗證的示例](http://stackoverflow.com/help/mcve)。「 – 2015-04-04 18:09:14

回答

1

一般來說,我認爲你如何去嘗試生成XML是困惑的。不要對代碼進行任何不必要的過分纏繞;而不是開始生成一些XML,然後在塊內部放棄它,因爲找不到您想要的頁面,先抓取您想要的頁面,然後然後開始處理。

我會將begin/rescue塊移到XML生成之外。它在XML生成塊內的存在導致使用nextbreak的邏輯不佳和存在可疑的做法。相反,我會推薦這樣的未經測試的代碼:

@main = [] 
@cont.each do |pr| 
    begin 
    @main << Nokogiri::HTML(
     open(@url + pr['href']) 
    ) 
    rescue 
    puts 'rescue' 
    next 
    end 
end 

builder = Nokogiri::XML::Builder.new do |xml| 
    xml.root { 
    xml.products { 
     @main.each do |m| 
     xml.product { 
      xml.id_ m.at('id').text 
      xml.name m.at('name').text 
     } 
     end 
    } 
    } 
end 
puts builder.to_xml 

這使得代碼的關鍵是能夠輕鬆地檢索一個頁面。

此代碼未經測試,因爲我們不知道您的輸入值是什麼或您的輸出應該是什麼樣子。如果您需要幫助調試代碼問題,那麼擁有有效的輸入,預期的輸出和演示問題的代碼示例是非常重要的。

使用@url + pr['href']通常不是一個好主意。而是使用URI類爲您構建網址。 URI處理編碼並確保URI有效。

+0

你VTC _and_答案?只是好奇... – 2015-04-06 17:27:36

+0

VTC?不知道是什麼。虛擬麻煩哄騙? – 2015-04-06 17:59:53

+0

VTC =投票關閉 – 2015-04-06 18:00:27