我正在尝试从 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/