处理Builder :: XmlMarkup中的异常

时间:2011-08-16 13:50:12

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

我想知道使用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>永远不会关闭。

我该如何正确地做到这一点?

1 个答案:

答案 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>

这是你要找的吗?