我正在尝试从 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 = { '发件人' => '1', '内容' => '嗨' }; $VAR1 = { '发件人' => '2', '内容' => '你好! };
我最终得到了一个双重解决方案,我编写了一个可以提取多行<message>
元素的简单解析器例程,并将这些格式良好的片段通过管道传输到另一个例程,在该例程中我使用 Perl XML 库来提取数据。