2015-03-13 3 views
2

У меня есть XML-документ из внешнего источника, который мне нужен разбор каждый день снова и снова с помощью XML::Simpleperl. Мой скрипт работает от crontab, и он отлично работает, если XML-документ здорова. Но я получаю сообщение об ошибке и умереть, если документ не действует, что-то вроде этого:Perl: как анализировать недопустимый XML-документ?

junk after document element at line 740774, column 0, byte 36355798 at /usr/local/lib/perl/5.18.2/XML/Parser.pm line 187. 

Я нашел эту строку в документе XML и это выглядит следующим образом:

<item> 
    <element1>value1</element1> 
    <element2>value2</element2> 
    value3</element3> 
    <element4>value4</element4> 
</item> 

Могу ли я разобрать этот неправильный документ без смерти? Может быть, отбросить этот элемент из анализатора с предупреждением (и не умереть!) Или каким-то образом игнорировать ошибки?

+2

Нет, вы не можете разобрать неверный XML. Вам нужно убедить тех, кто создает данные, чтобы сделать это правильно, или исправить их самостоятельно, прежде чем обрабатывать их. Всегда ли ошибки одинаковы? – Borodin

+0

нет, они переменные ... Я думаю, что это исходит от разработчиков исходной системы. Если они ошибаются, я получаю неверный XML. – netdjw

+0

Не думайте об этом как XML. Подумайте об этом как проприетарный синтаксис, изобретенный составителем. Напишите грамматику для этого синтаксиса, если нужно, обратное проектирование, а затем напишите парсер для этой грамматики. Дорогой, но вполне выполнимый. Если вы хотите более дешевый вариант, убедите поставщика принять XML: использование стандартов экономит все деньги. –

ответ

3

У вас нет. Малоформатный XML является фатальной ошибкой, и вы абсолютно не пытаетесь его исправить.

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

См: Dealing with malformed XML

И особенно: http://www.xml.com/axml/notes/Draconian.html

Мы хотим XML, чтобы расширить возможности программистов писать код, который может быть передан через Интернет и выполнять на большом количестве компьютеров. Однако, если этот код должен включать обработку ошибок для всех видов неаккуратных практик конечных пользователей, он по необходимости должен иметь размер шара до такой степени, что он, например Netscape Navigator или Microsoft Internet Explorer, имеет размер в десятки мегабайт, побеждая цель.

В данном случае - вы также не должны использовать XML::Simple, который имеет в его документы:

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

В основном - XML::Simple лежит это не простой XML-анализатор. Это для простой XML. И есть лучшие варианты.

Я бы предложил с учетом чего-то вроде XML::Twig. (Есть другие варианты - это мой любимый).

Но не будет обрабатывать искаженный XML - любой парсер, который делает это по определению сломан.

+2

@netdjw: оригинатору очень легко проверить XML, прежде чем отправлять его вам. Они могут даже делать это в режиме онлайн на ['xmlvalidation.com'] (http://www.xmlvalidation.com/) – Borodin

Смежные вопросы