我正在尝试生成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生成块中的存在导致使用next
和break
的逻辑性差和实践有问题。相反,我推荐一些类似于未经测试的代码:
@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有效。