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

标签 ruby-on-rails ruby xml error-handling

我想知道在使用 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/

相关文章:

ruby-on-rails - Rails 注释关联-模型结构

javascript - npm install 是否意味着该脚本仅适用于 Node.js

javascript - 为什么 Jquery parseXML 不起作用?

python - 在 Elementtree 中找不到元素

ruby-on-rails - 请求的资源上不存在 'Access-Control-Allow-Origin' header - Rails 4.2

javascript - $(...).validate 不是函数

ruby-on-rails - 如何在 ruby​​ API 中创建异步请求、阻塞方法

ruby - 在本地机器上运行 Cucumber 测试时抑制 Selenium 警告

xml - 如何从 Apple iTunes «App Store» 和 «Mac App Store» 获取信息

ruby-on-rails - 使用 Rails 中的 Nokogiri 加速 XML 到 MySQL