我正在尝试生成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的错误,因为循环开头的开括号?
答案 0 :(得分:1)
总的来说,我认为你试图生成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有效。