使用PERL在XML中删除TAG内的TAG

时间:2015-01-15 08:01:06

标签: perl xml-twig

我有以下XML:

  <TRADEEXT>
    <TRADE att="err" att1="2">
      <val_1 att_01="13"/>
        <TRADE att="err1" att1="2">
          <val_1 att_01="13"/>
        </TRADE>
    </TRADE>
    <TRADE att="err12" att1="211">
      <val_1 att_01="131"/>
        <TRADE att="err11" att1="21">
          <val_1 att_01="13"/>
        </TRADE>
    </TRADE>
  </TRADEEXT>

要求非常简单。需要删除所有子交易

因此所需的输出必须是:

  <TRADEEXT>
    <TRADE att="err" att1="2">
      <val_1 att_01="13"/>
    </TRADE>
    <TRADE att="err12" att1="211">
      <val_1 att_01="131"/>
    </TRADE>
  </TRADEEXT>

可以看出,没有剩下的子交易。

以下是我写过的代码。

#!/usr/bin/perl

use warnings;
use strict;
use XML::Twig;

use XML::Twig;
my $twig = new XML::Twig(twig_handlers => {'TRADEEXT/TRADE/TRADE' => sub { $_->delete() }});

$twig->parsefile(file_name_1.xml');
$twig->set_pretty_print('indented');

我不知道为什么它不起作用。

2 个答案:

答案 0 :(得分:1)

我猜您应该在代码末尾添加$twig->print

答案 1 :(得分:-1)

修好了。发表我的回答,以便将来可以帮助别人。

#!/usr/bin/perl

use strict;
use warnings;
use XML::Twig;


my $twig = new XML::Twig( twig_handlers => { 'TRADE/TRADE' => \&TRADE } );

$twig->parsefile('FILE_NAME_1.xml');

$twig->set_pretty_print('indented');

$twig->print_to_file('out.xml');

sub TRADE {
    my ( $twig, $TRADE ) = @_;
    foreach  my $c ($TRADE) 
    {
     $c->delete($TRADE) 

      ;
    }
}