0

XML::Twig を使用して次の XML 構造から特定のノードのセットを抽出しようとしましたが、それ以来スタックしています。次の構造から「プレーヤー」ノードを抽出し、これらのノード値のそれぞれに対して文字列の一致/置換を行う必要があります。

<pep:record>
    <agency type="player">
        <subrecord type="scout">
            <isnum>123XXX (print)</isnum>
            <isnum>234YYY (mag)</isnum>
        </subrecord>
        <subrecord type="group">
        </subrecord>
    </agency>
</record>

次のコードを使用してみましたが、実際の文字列ではなくハッシュ参照を指しています。

my $parser = XML::Twig->new(twig_handlers => {
        isnum => sub { print $_->text."::" },
    });

foreach my $rec (split(/::/, $parser->parse($my_xml))) {
    if ($rec =~ m/print/) {
        ($print = $rec)  =~ s/( \(print\))//;
    }
    elsif($rec =~ m/mag/) {
        ($mag = $rec) =~ s/( \(mag\))//;
    }
}
4

1 に答える 1

1

私が理解しているように、次のようなものが必要です。

use Modern::Perl;
use XML::Twig;

my $my_xml = <<EOL;
<pep:record>
    <agency type="player">
        <subrecord type="scout">
            <isnum>123XXX (print)</isnum>
            <isnum>234YYY (mag)</isnum>
        </subrecord>
        <subrecord type="group">
        </subrecord>
    </agency>
</pep:record>
EOL

my @records;

my $parser = XML::Twig->new(twig_handlers => {
        isnum => sub { push @records, $_->text },
    });

$parser->parse($my_xml);

foreach my $rec (@records) {
    if ($rec =~ m/print/) {
        $rec  =~ s/( \(print\))//;
    }
    elsif ($rec =~ m/mag/) {
        $rec =~ s/( \(mag\))//;
    }

    say $rec;
}
于 2013-11-09T04:16:59.383 に答える