我正在尝试以XML格式从日志文件中提取数据。由于这些是巨大的,我使用XML::Twig从缓冲区而不是整个文件中提取相关数据
由于这些是来自STDIN的串联数据,因此XML远未形成。解析器经常因错误而停止。如何让XML解析器忽略错误并仅提取我感兴趣的标记?我是否必须回退到正则表达式解析(start-tag-end-tag)?
答案 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库来提取数据。