ruby - 如何整理 ruby​​ 中格式错误的 xml

标签 ruby xml nokogiri sax tidy

我在整理格式错误的 XML 代码时遇到问题 我从 SEC's edgar database 返回.

出于某种原因,它们的 xml 格式非常糟糕。包含任何类型字符串的标签不会被关闭,它实际上可以在其他标签中包含其他 xml 或 html 文档。通常我会把这个关闭到Tidy但这并没有得到维护。

我尝试过使用 Nokogiri::XML::SAX::Parser,但由于标签未关闭,这似乎令人窒息。它似乎工作正常,直到它到达第一个结束标签,然后它不再触发它们。但它会吐出正确的字符。

  class Filing < Nokogiri::XML::SAX::Document
    def start_element name, attrs = []
      puts "starting: #{name}"
    end

    def characters str
      puts "chars: #{str}"
    end

    def end_element name
      puts "ending: #{name}"
    end
  end

这似乎是最好的选择,因为我可以让它忽略其他 xml 或 html 文档。这也是最有意义的,因为其中一些文档可能会变得非常大,因此将整个 dom 存储在内存中可能行不通。

以下是一些示例文件:1 2 3

我开始认为我只需要编写自己的自定义解析器

最佳答案

Nokogiri 的正常 DOM 模式能够自动修复 XML,使其在句法上是正确的,或者是其合理的复制品。它有时会变得困惑并且会移动结束标记,但您可以预处理文件以在需要时将其推向正确的方向。

我将 XML #1 保存到文档中并加载它:

require 'nokogiri'

doc = ''
File.open('./test.xml') do |fi|
  doc = Nokogiri::XML(fi)
end

puts doc.to_xml

解析后,您可以检查 Nokogiri::XML::Document 实例的 errors 方法以查看生成了哪些错误,以获得反常的乐趣。

doc.errors

如果使用 Nokogiri 的 DOM 模型不够好,您是否考虑过使用 XMLLint预处理和清理数据,发出干净的 XML 以便 SAX 能够工作?它的 --recover 选项可能有用。

xmllint --recover test.xml

它将在 stderr 上输出错误,在 stdout 上输出代码,因此您可以轻松地将其通过管道传输到另一个文件。

至于编写自己的解析器……为什么?您还有其他可用的选择,重新发明一个实现良好的轮子并不是很好地利用时间。

关于ruby - 如何整理 ruby​​ 中格式错误的 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7072738/

相关文章:

mysql - RoR 监视经常更新的表中的更改

ruby - 这在 Ruby 语言中是什么意思?

ruby-on-rails - Rails 控制台 - 查找在某天创建的位置

c# - 在 C# 中将 Soap 请求 header 从 text/xml 更改为 soap/xml for asmx webservice

xml - AppendChild到XML的特定位置

ruby - 使用 Nokogiri 转义 XPath 中的单引号?

ruby - 使用正则表达式找到一个字符串,然后使用正则表达式找到一个新的字符串来替换它

ruby - 是什么阻止我在 Ruby 中包含一个类?

c - libxml2 解析带有缩进的文档

Node.js 上的 HTML 解析器