Текст :: Сбалансированный и многострочный xml - PullRequest
3 голосов
/ 23 августа 2011

Похоже, я немного растерялся.

Мне нужно проанализировать большой (около 100 МБ) и довольно уродливый XML-файл.Если я использую parsefile, он возвращает ошибку (мусор после элемента документа), но он с радостью проанализирует меньшие элементы файла.

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

Что-то вроде

use Text::Balanced qw/extract_tagged/;

while (<FILE>) {
     my $result = extract_tagged($_, "<tag>");
     print $result if defined $result;
}

, работает отлично, поэтомуЯ могу извлечь помеченные записи, которые помещаются в одну строку.С чем-то большим, однако

use Text::Balanced qw/extract_tagged/;
use File::Slurp;

my $test = read_file("file");
my $result = extract_tagged($text, "<tag>");
print $result;

не работает.Он читает файл, но не может найти там помеченный элемент.

Итак, вопрос в том, как извлечь что-либо между заданными тегами без XML::Parser?И мне действительно нужно избегать этого, если это возможно.

PS поиск вернул бы руководства по регулярным выражениям, heredoc howtos и все что угодно, кроме того, что я ищу

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


Ответ bvr был близок, он действительно получит некоторые данные, но не при отсутствии тега верхнего уровня.

Ответы [ 2 ]

6 голосов
/ 24 августа 2011

Для испорченного XML я бы попытался установить для параметра recover значение XML :: LibXML .Это заставляет игнорировать ошибки синтаксического анализа и продолжать.

4 голосов
/ 24 августа 2011

Использование Text::Balanced для анализа XML похоже на использование швейцарского ножа для операции на открытом сердце - только потому, что вы можете сделать это, не означает, что вы должны.

Если XML::Parser доставляет вам затруднения, попробуйте новую библиотеку XML-разбора, например XML::LibXML или XML::Twig

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