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 には、SAX スタイルのコールバック インターフェイスが気に入らない場合に備えて、すべてのノードを生成する Reader インターフェイスもあります。
reader = Nokogiri::XML::Reader(xml)
reader.each do |node|
# node is an instance of Nokogiri::XML::Reader
puts node.name
end
違いは、根底にある libXML2 回復モード (デフォルトではオンになっていると思います) のおかげで、Nokogiri はそこにあるほとんどのパーサーよりも非整形式性から回復できることです。