Могу ли я написать программу для чтения XML, которая может справиться с незамкнутыми тегами? - PullRequest
0 голосов
/ 06 июля 2011

Я анализирую дамп XML в Википедии, используя REXML StreamListener. После нескольких миллионов статей он жалуется, что не может найти соответствующий закрывающий тег, и пропускает оставшуюся часть файла.

Есть ли способ заставить его игнорировать незамкнутый тег и возобновить разбор потока после него?

1 Ответ

1 голос
/ 06 июля 2011

Режим 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 (по-моему, по умолчанию).

...