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

标签 xml perl parsing xml-twig

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

由于这些是来自 STDIN 的串联数据,因此 XML 的格式远非正确。解析器经常因错误而停止。我怎样才能让 XML 解析器忽略错误并只提取我感兴趣的标签?我是否必须退回到正则表达式解析(开始标记 - 结束标记)?

最佳答案

我实际上只会累积 <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!'
        };

关于xml - 如何使用 Perl 的 XML::Twig 解析不完整的 XML 片段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3890317/

相关文章:

java - 从表达式树打印后序表达式时出现问题。 ( java )

parsing - 关于可行前缀的说明

javascript - 具有两个参数的 Angular 函数具有错误 : [$parse:syntax]

xml - XML 节点的合并

java - 无法使用 launch4j 重命名进程/图像名称

xml - 在 XML 元素名称中使用 -

perl - 如何使用 Perl 连接到 SQL Server?

java - 在 java 中获取带有命名空间的 XML 节点

mysql - 如何绑定(bind)值 INSERT INTO mysql perl

相当于 php -E 的 perl 命令行