gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 02:32:01 24 4
gpt4 key购买 nike

我在整理格式错误的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com