我可能会问一个基本问题,但这会让我感到害怕.
以下是我的代码段
#!/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";
}
Run Code Online (Sandbox Code Playgroud)
这是按预期工作的.它给了我所有的"原产地"等于"计算机"的交易.
但我需要处理跨越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;
}
Run Code Online (Sandbox Code Playgroud)
这给了我空文件.我试图冲洗那些用于有效使用内存的树枝.
我不知道为什么它给我空白的输出文件.
示例XML:
<TRADEEXT>
<TRADE origin = 'COMPUTER'/>
<TRADE origin = 'COMP'/>
<TRADE origin = 'COMPP'/>
</TRADEEXT>
Run Code Online (Sandbox Code Playgroud)
输出文件:
<TRADEEXT>
<TRADE origin = 'COMPUTER'/>
</TRADEEXT>
Run Code Online (Sandbox Code Playgroud)
您应该使用flush(到filehanlde)而不是purge:flush输出到目前为止已解析的树枝并释放内存,同时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');
Run Code Online (Sandbox Code Playgroud)
这将在文件中留下一些额外的空行,您可以在以后删除它们.该twig_roots处理器被触发,你需要删除所有元素,并删除它们,而twig_print_outside_roots选项导致所有其他元素将被打印as_is.