3

ログ ファイルから XML 形式のデータを抽出しようとしています。これらは巨大であるため、XML::Twigを使用して、ファイル全体ではなくバッファから関連データを抽出しています

これらは STDIN からの連結データであるため、XML は整形式とはほど遠いものです。そのため、パーサーは頻繁にエラーで停止します。XML パーサーにエラーを無視させ、関心のあるタグのみを抽出させるにはどうすればよいですか? 正規表現の解析 (開始タグ - 終了タグ) にフォールバックする必要がありますか?

4

2 に答える 2

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 = {
          '送信者' => '1',
          'コンテンツ' => 'こんにちは'
        };
$VAR1 = {
          '送信者' => '2',
          'content' => 'こんにちは!'
        };
于 2010-10-08T13:07:23.270 に答える
0

最終的には、複数行の要素を抽出できる単純なパーサー ルーチンを作成し<message>、これらの適切な形式のフラグメントを別のルーチンにパイプして、Perl XML ライブラリを使用してデータを抽出するという 2 つのソリューションに行き着きました。

于 2011-03-22T13:10:52.007 に答える