在PERL中过滤XML的TWIG
不知怎的,我被卡住了,头撞到了。 我必须从一个巨大的XML文件中删除不需要的交易在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
<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' );
}