ログ ファイルから 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', 'content' => 'こんにちは!' };
最終的には、複数行の要素を抽出できる単純なパーサー ルーチンを作成し<message>
、これらの適切な形式のフラグメントを別のルーチンにパイプして、Perl XML ライブラリを使用してデータを抽出するという 2 つのソリューションに行き着きました。