我在整理从以下网站返回的格式错误的 XML 代码时遇到问题SEC 的 edgar 数据库 http://www.sec.gov/edgar.shtml.
由于某种原因,他们形成了可怕的 xml。包含任何类型字符串的标签都不是封闭的,它实际上可以在其他标签内包含其他 xml 或 html 文档。通常我会这么做Tidy http://rubyforge.org/projects/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 http://pastie.org/2378220 2 http://pastie.org/2378228 3 http://pastie.org/2378237
我开始认为我只需要编写自己的自定义解析器
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 http://xmlsoft.org/xmllint.html预处理和清理数据,发出干净的 XML,以便 SAX 能够工作?它是--recover
选项可能有用。
xmllint --recover test.xml
它将在 stderr 上输出错误,并在 stdout 上输出代码,因此您可以轻松地将其通过管道传输到另一个文件。
至于编写自己的解析器......为什么?您还有其他选择,重新发明一个实施良好的轮子并不是浪费时间的好方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)