Похоже, я немного растерялся.
Мне нужно проанализировать большой (около 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 был близок, он действительно получит некоторые данные, но не при отсутствии тега верхнего уровня.