Восстановление испорченного XML-файла - удаление лишних знаков «больше / больше» - PullRequest
2 голосов
/ 26 марта 2010

У меня большой XML-файл, который в середине содержит следующее:

<ArticleName>Article 1 <START  </ArticleName>

Очевидно, что libxml и другие библиотеки XML не могут прочитать это, потому что знак «меньше» открывает новый тег, который никогда не закрывается. У меня вопрос, могу ли я что-нибудь сделать, чтобы автоматически решить подобные проблемы (желательно в Ruby)? Конечно, решение должно работать для любой области, в которой есть такая ошибка. Кто-то сказал, что SAX-разбор может помочь, но я не уверен, как это сработает.

Ответы [ 2 ]

2 голосов
/ 26 марта 2010

Nokogiri поддерживает некоторые опции для обработки плохого XML. Это может помочь:

http://rubyforge.org/pipermail/nokogiri-talk/2009-February/000066.html http://nokogiri.org/tutorials/ensuring_well_formed_markup.html

Я только что испортил сломанный фрагмент, и Нокогири очень хорошо с ним справился:

#!/usr/bin/ruby

require 'rubygems'
require 'nokogiri'

doc = Nokogiri::XML('<?xml version="1.0"?><ArticleName>Article 1 <START  </ArticleName></xml>')
doc.to_s  # => "<?xml version=\"1.0\"?>\n<ArticleName>Article 1 <START/></ArticleName>\n"
doc.errors # => [#<Nokogiri::XML::SyntaxError: error parsing attribute name

2 голосов
/ 26 марта 2010

Вы можете выполнять поиск и замену регулярного выражения, ища <(?=[^<>]*<) и заменяя на &lt;.

в рубине

result = subject.gsub(/<(?=[^<>]*<)/, '&lt;')

Основанием для этого является то, что вы хотите найти <, у которого нет соответствующего >. Следовательно, регулярное выражение соответствует <, только если за ним следует другой без > между ними.

РЕДАКТИРОВАТЬ: Улучшено регулярное выражение с использованием Lookahead. Сначала я подумал, что Руби не поддерживает прогноз, но это так. Только не смотреть назад ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...