Как я могу разобрать неполные фрагменты XML с помощью Perl XML :: Twig? - PullRequest
3 голосов
/ 08 октября 2010

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

Поскольку это конкатенированные данные из STDIN,далеко не хорошо сформирован.Так часто парсер останавливается с ошибкой.Как я могу заставить анализатор XML игнорировать ошибки и извлекать только те теги, которые меня интересуют?Должен ли я вернуться к анализу регулярных выражений (start-tag - end-tag)?

Ответы [ 2 ]

4 голосов
/ 08 октября 2010

Я бы просто скопировал данные между тегами <message></message> и затем проанализировал бы эту строку, предполагая, что содержимое каждого сообщения невелико:

#!/usr/bin/perl

use strict; use warnings;

use XML::Simple;
use Data::Dumper;

my $in_message;
my $message;

LOGENTRY:
while ( my $line = <DATA> ) {
    while ( $line =~ /^<message/ .. $line =~ m{</message>$} ) {
        $message .= $line;
        next LOGENTRY;
    }
    if ( $message ) {
        process_message($message);
        $message = '';
    }
}

sub process_message {
    my ($message) = @_;

    my $xml = XMLin(
        $message,
        ForceArray => 1,
    );
    print Dumper $xml;
}

__DATA__
ldksj
lskdfj
lksd

sdfk

<message sender="1">Hi</message>

sdk
dkj

<message sender="2">Hi yourself!</message>

sd

Вывод:

$VAR1 = {
          'sender' => '1',
          'content' => 'Hi'
        };
$VAR1 = {
          'sender' => '2',
          'content' => 'Hi yourself!'
        };
0 голосов
/ 22 марта 2011

Я получил двойное решение, в котором написал простую подпрограмму синтаксического анализа, которая могла бы извлекать многострочные <message> элементы, и передал эти правильно сформированные фрагменты в другую подпрограмму, где я использовал библиотеки Perl XML для извлечения данных.

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