我正在使用 REXML StreamListener 解析维基百科 XML 转储。在几百万篇文章之后,它抱怨找不到匹配的关闭标签,并跳过文件的其余部分。
有没有办法让它忽略未关闭的标签,并在它之后继续解析流?
Nokogiri SAX 模式与 REXML 的 SAX (StreamListener) 模式非常相似。样本:
require 'nokogiri'
include Nokogiri
class PostCallbacks < XML::SAX::Document
def start_element(element, attributes)
if element == 'tag'
# Process tag data here
end
end
end
parser = XML::SAX::Parser.new(PostCallbacks.new)
parser.parse_file("data.xml")
Nokogiri 还有一个 Reader 接口,它产生每个节点,以防您不喜欢 SAX 风格的回调接口。
reader = Nokogiri::XML::Reader(xml)
reader.each do |node|
# node is an instance of Nokogiri::XML::Reader
puts node.name
end
不同之处在于,由于底层的 libXML2 恢复模式(我相信默认情况下启用),Nokogiri 可以比几乎任何解析器更好地从非格式良好的状态中恢复。