我想知道使用Ruby的XML构建器生成大型XML Feed时处理错误的好方法是什么?我遇到的问题是我将数百万条记录写入XML文件,由于数据质量的原因,有些可能会失败。
但是,我不希望构建器因单个失败记录而终止。这是一个说明问题的片段:
xml = Builder::XmlMarkup.new
xml.outer do
begin
xml.inner do
xml.text "content"
raise "your hands"
end
rescue
puts "how should this be handled?"
end
end
这将输出以下XML:
<outer><inner><text>content</text></outer>
无效,因为<inner>
永远不会关闭。
我该如何正确地做到这一点?
答案 0 :(得分:1)
它并不理想,但您可以使用&lt;&lt ;.手动将关闭标记(或其他任何内容)附加到XmlBuilder实例。听起来你正在寻找这样的东西:
xml = Builder::XmlMarkup.new
xml.outer do
begin
xml.inner do
xml.text "content"
raise "your hands"
end
rescue
xml << "</inner>"
end
end
因为救援会插入</inner>
标记,您将得到如下输出:
"<outer><inner><text>content</text></inner></outer>"
啊,基于你的评论,那么,你正在寻找使用嵌套XmlMarkups的东西。试试这个:
outside_xml = Builder::XmlMarkup.new
outside_xml.outer do
begin
# Declare a string to use as a buffer
buffer = ''
# Create a separate XmlMarkup builder that writes to the buffer
inside_xml = Builder::XmlMarkup.new(target: buffer)
inside_xml.inner do
inside_xml.text "content"
raise "your hands"
end
rescue
# Clear the buffer on an error
buffer = ''
end
# Write the finished buffer inside the outside XmlMarkup builder
outside_xml << buffer
end
这有点棘手,因为它使用了两个独立的XML构建器。基本上没有办法在XmlMarkup中回滚标签。相反,我们为内部内容使用单独的XmlMarkup实例并手动将其提供给外部构建器 - 因为我们使用内部构建器的目标,我们可以从外部调整目标的内容我们传递它之前的XmlBuilder。
所以,如果你运行这个带有异常的新例子,你会得到:
<outer></outer>
如果你在注释掉的例外情况下运行它,你会得到:
<outer><inner><text>content</text></inner></outer>
这是你要找的吗?