在PERL中过滤XML的TWIG

在PERL中过滤XML的TWIG,perl,xml-twig,Perl,Xml Twig,不知怎的,我被卡住了,头撞到了。 我必须从一个巨大的XML文件中删除不需要的交易 <TRADEEXT> <TRADE origin = 1,version =1> <EVENT externtype ='PROC'/> <EVENT externtype ='PROCC'/> </TRADE> <TRADE origin = 1,version =1> <EVENT exter

不知怎的,我被卡住了,头撞到了。 我必须从一个巨大的XML文件中删除不需要的交易

<TRADEEXT>
  <TRADE origin = 1,version =1>
     <EVENT externtype ='PROC'/>
     <EVENT externtype ='PROCC'/>
  </TRADE>
  <TRADE origin = 1,version =1>
     <EVENT externtype ='PROCC'/>
  </TRADE>
</TRADEEXT>
不幸的是,它正在删除事件标记而不是交易标记


任何提示都将不胜感激。

我不知道XML::Twig。在XML::LibXML中,您可以

for my $bad_trade ('/TRADEEXT/TRADE[ EVENT/@externtype = "PROCC" ]') {
    $bad_trade->parentNode->removeChild($bad_trade);
}

您需要执行
$TRADE->cut
而不是
$c->cut
。但是,由于您的条件为
$c
,因此您可能需要执行以下操作:

sub TRADE {

    my ( $node, $TRADE ) = @_ ;

    $TRADE->cut
      unless grep { $_->att( 'eventtype' ) eq 'PROC' } $TRADE->children( 'EVENT' );
}

扎伊德,谢谢你的宝贵意见。实际上FIRST_CHILD不会有帮助,因为一笔交易中可能有多个事件…很抱歉在我的问题中遗漏了这一点…因此,如果FIRST EVENT不满足条件,鉴于第二个事件是令人满意的。那么交易也是合法的。简言之,即使任何交易中的一个事件满足条件,那么必须选择交易。@vikas:方法保持不变;只是需要更新条件以循环所有事件节点,并查看其中是否有具有指定值的属性。非常感谢您的努力。上面的代码片段只是将这些交易复制到一个新文件中,而在任何事件下都没有“PROC”。而我想要的恰恰相反。我尝试了“ne”而不是“eq”,但没有效果。请提供您的insight@vikas:然后将第一段代码从
if
更改为
,除非
Awesome…Done..thanxsorry…将在将来记住
for my $bad_trade ('/TRADEEXT/TRADE[ EVENT/@externtype = "PROCC" ]') {
    $bad_trade->parentNode->removeChild($bad_trade);
}
sub TRADE {

    my ( $node, $TRADE ) = @_ ;

    $TRADE->cut
      unless grep { $_->att( 'eventtype' ) eq 'PROC' } $TRADE->children( 'EVENT' );
}