我正在使用REXML StreamListener解析维基百科XML转储。在几百万篇文章之后,它抱怨它无法找到匹配的关闭标记,并跳过文件的其余部分。
有没有办法让它忽略unclosed标签,并在它之后继续解析流?
答案 0 :(得分:1)
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
不同之处在于Nokogiri可以从非格式化中恢复得比几乎任何解析器更好,这要归功于底层的libXML2恢复模式(默认情况下我相信)。