如何使用Perl的XML :: Twig解析不完整的XML片段?

时间:2010-10-08 12:10:32

标签: xml perl parsing xml-twig

我正在尝试以XML格式从日志文件中提取数据。由于这些是巨大的,我使用XML::Twig从缓冲区而不是整个文件中提取相关数据

由于这些是来自STDIN的串联数据,因此XML远未形成。解析器经常因错误而停止。如何让XML解析器忽略错误并仅提取我感兴趣的标记?我是否必须回退到正则表达式解析(start-tag-end-tag)?

2 个答案:

答案 0 :(得分:4)

我实际上只是在<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!'
        };

答案 1 :(得分:0)

我最终得到了一个双解决方案,我编写了一个简单的解析器例程,可以提取多行<message>元素,并将这些格式良好的片段传送到另一个例程,我使用Perl XML库来提取数据。