使用XML::Twig从XML中提取特定节点

使用XML::Twig从XML中提取特定节点,xml,perl,xml-twig,Xml,Perl,Xml Twig,我试图使用XML::Twig从以下XML结构中提取一组特定的节点,但从那以后就一直被卡住了。我需要从以下结构中提取“player”节点,并对每个节点值进行字符串匹配/替换 <pep:record> <agency type="player"> <subrecord type="scout"> <isnum>123XXX (print)</isnum> <isn

我试图使用XML::Twig从以下XML结构中提取一组特定的节点,但从那以后就一直被卡住了。我需要从以下结构中提取“player”节点,并对每个节点值进行字符串匹配/替换

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

据我所知,你需要这样的东西:

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;
}
使用Modern::Perl;
使用XML::Twig;
my$my_xml={
isnum=>sub{push@records,$\->text},
});
$parser->parse($my_xml);
foreach my$rec(@records){
如果($rec=~m/print/){
$rec=~s/(\(print\)/;
}
elsif($rec=~m/mag/){
$rec=~s/(\(mag\)/;
}
比如$rec;
}

您的示例XML不完整。里面既没有提到
播放器
也没有提到
。哎呀!我的错!变量拼错了,我不是这个意思。我说的是XML。末尾缺少了一个
,但是您也引用了
播放器
节点,但是XML中没有这样的节点。我们需要一个完整的例子。
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;
}