XML生成器中的Foreach循环不会中断

时间:2015-04-01 09:11:30

标签: ruby xml nokogiri

我正在尝试生成XML,但循环没有破坏。以下是代码的一部分:

@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" => "foo@bar.invalid", "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的错误,因为循环开头的开括号?

1 个答案:

答案 0 :(得分: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类为您构建URL。 URI处理编码并确保URI有效。