$ twig-> purge给出空文件

时间:2015-02-09 15:16:02

标签: perl xml-twig

我可能会问一个基本问题,但这会让我感到害怕。

以下是我的代码段

#!/usr/bin/perl

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


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

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

$twig->set_pretty_print('indented');

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

sub TRADE {
    my ( $twig, $TRADE ) = @_;
    #added delete in place of cut
     $TRADE->cut($TRADE) unless
     $TRADE->att('origin') eq "COMPUTER";
}

这是按预期工作的。它给了我所有“原点”等于“计算机”的交易。

但是我需要处理跨越1 GB的XML文件。 在这种情况下,它会“分割错误”,因为它消耗了大量内存。

因此,为了解决这个问题,我试图实现XML :: Twig的“清除”概念

因此我将代码修改为:

#!/usr/bin/perl

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


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

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

    $twig->set_pretty_print('indented');

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

    sub TRADE {
        my ( $twig, $TRADE ) = @_;
        #added delete in place of cut
         $TRADE->cut($TRADE) unless
         $TRADE->att('origin') eq "COMPUTER";

         $twig->purge; 
    }

这给了我空文件。我正在尝试清理那些用于有效使用内存的树枝。

我不知道它为什么给我空白输出文件。

示例XML:

<TRADEEXT>
 <TRADE origin = 'COMPUTER'/>
 <TRADE origin = 'COMP'/>
 <TRADE origin = 'COMPP'/>  
</TRADEEXT>

输出文件:

<TRADEEXT>
 <TRADE origin = 'COMPUTER'/>
</TRADEEXT>

1 个答案:

答案 0 :(得分:5)

您应该使用flush(对于文件)而不是purgeflush输出到目前为止已解析的树枝并释放内存,而purge只释放记忆。

如果你想要的只是删除那些没有正确属性的TRADE元素,你可以这样做:

#!/usr/bin/perl

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

open( my $out, '>:utf8', "out.xml") or die "cannot create output file out.xml: $!";

my $twig = XML::Twig->new( pretty_print => 'indented',
                           twig_roots => { 'TRADE[@origin != "COMPUTER"]' 
                                              => sub { $_->delete; } 
                                         },
                           twig_print_outside_roots => $out,
                         )

                    ->parsefile('1510.xml');

这将在文件中留下一些额外的空行,您可以在以后删除它们。为您需要删除的所有元素触发twig_roots处理程序,并删除它们,而twig_print_outside_roots选项会导致所有其他元素打印为as_is。