XML生成器中的Foreach循环未中断



我正在尝试生成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的错误,因为循环头中有开括号吗?

一般来说,我认为您将如何尝试生成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有效。

相关内容

  • 没有找到相关文章

最新更新