0

我正在使用 REXML StreamListener 解析维基百科 XML 转储。在几百万篇文章之后,它抱怨找不到匹配的关闭标签,并跳过文件的其余部分。

有没有办法让它忽略未关闭的标签,并在它之后继续解析流?

4

1 回答 1

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

不同之处在于,由于底层的 libXML2 恢复模式(我相信默认情况下启用),Nokogiri 可以比几乎任何解析器更好地从非格式良好的状态中恢复。

于 2011-07-06T12:56:30.323 回答