gpt4 book ai didi

ruby-on-rails - 在 Builder::XmlMarkup 中处理异常

转载 作者:数据小太阳 更新时间:2023-10-29 02:42:19 34 4
gpt4 key购买 nike

我想知道在使用 Ruby 的 XML 构建器生成大型 XML 提要时处理错误的最佳做法是什么?我遇到的问题是我正在将数百万条记录写入一个 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>永远不会关闭。

我该如何正确执行此操作?

最佳答案

这并不理想,但您可以使用 << 手动将关闭标记(或其他任何东西)附加到 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>"

更新

啊,根据您的评论,您正在寻找使用嵌套 XmlMarkup 的东西。试试这个:

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>

这是您要找的吗?

关于ruby-on-rails - 在 Builder::XmlMarkup 中处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7079200/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com