2011-08-16 3 views
3

У меня возникают проблемы с убогом неверного кода XML. Я возвращаюсь с SEC's edgar database.Как убрать неправильный xml в ruby ​​

По какой-то причине они имеют ужасно сформированный xml. Теги, содержащие любую строку, не закрыты и фактически могут содержать другие документы xml или html внутри других тегов. Обычно у меня было это до Tidy, но это не поддерживается.

Я пробовал использовать Nokogiri :: XML :: SAX :: Parser, но кажется, что он задыхается, потому что теги не закрыты. Кажется, что все работает нормально, пока оно не попадет в первый завершающий тег, а затем больше не срабатывает. Но он выплескивает правильных персонажей.

class Filing < Nokogiri::XML::SAX::Document 
    def start_element name, attrs = [] 
     puts "starting: #{name}" 
    end 

    def characters str 
     puts "chars: #{str}" 
    end 

    def end_element name 
     puts "ending: #{name}" 
    end 
    end 

Похоже, что это будет лучший вариант, потому что я могу просто игнорировать его другой XML или HTML документ. Кроме того, это будет иметь наибольший смысл, потому что некоторые из этих документов могут стать довольно большими, поэтому хранение всей памяти в памяти, вероятно, не сработает.

Вот несколько примеров файлов: 123

Я начинаю думать, что я просто должен написать свой собственный анализатору

нормальный режим DOM
+0

Пожалуйста, определите «довольно большой», если вы имеете в виду большой файл. Большинство машин в эти дни могут легко проглотить файлы с несколькими гигабайтами. –

ответ

3

Nokogiri является возможность автоматически фиксировать-вверх по XML, так что это синтаксически корректно или разумное факсимиле. Иногда это путается и сдвигает закрывающие теги, но вы можете предварительно обработать файл, чтобы при необходимости подтолкнуть его в правильном направлении.

Я сохранил XML # 1 к документу и зарядил:

require 'nokogiri' 

doc = '' 
File.open('./test.xml') do |fi| 
    doc = Nokogiri::XML(fi) 
end 

puts doc.to_xml 

После разбора, вы можете проверить errors метод экземпляра Nokogiri :: XML :: Document, чтобы увидеть, какие ошибки были получены для извращенное удовольствие.

doc.errors 

При использовании модели DOM Nokogiri не достаточно хорошо, вы рассмотрели с помощью XMLLint для предварительной обработки и очистки данных, испуская чистый XML, так что SAX будет работать? Его вариант --recover может быть полезен.

xmllint --recover test.xml 

Он будет выводить ошибки на стандартный вывод ошибок, и код на стандартный вывод, так что вы можете трубы легко в другой файл.

Что касается написания собственного анализатора ... почему? У вас есть другие варианты, доступные вам, и изобретать красиво выполненное колесо не очень полезно.

+0

Ни один из этих решений не работает с файлами примера. В конце они помещают большую часть закрывающих тегов. – hadees

+2

Именно поэтому я иногда говорил, что вам нужно предварительно обработать файл, чтобы дать парсеру достаточно информации, чтобы делать что-то правильно. –

+0

@ Ни один из этих решений не работает с тех пор, как они пытаются восстановить неверно сформированный XML, который явно запрещен стандартом. Инструменты не имеют возможности узнать, где закрыть тег. – Serabe