我在整理格式错误的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 doc。它也是最有意义的,因为其中一些文档可能会变得非常大,因此将整个dom存储在内存中可能无法正常工作。
我开始认为我只需编写自己的自定义解析器
答案 0 :(得分: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上输出代码,因此您可以轻松地将其传输到另一个文件。
至于编写自己的解析器......为什么?你还有其他的选择,重新发明一个很好实现的轮子并不能很好地利用时间。