我可以编写一个可以处理未封闭标签的XML阅读器吗?

时间:2011-07-06 10:35:02

标签: ruby rexml

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

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

1 个答案:

答案 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恢复模式(默认情况下我相信)。