$twig->purge 给出空文件
$twig->purge is giving empty file
我可能会问一个基本问题,但它让我很生气。
以下是我的代码片段
#!/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";
}
这是按预期工作的。它为我提供了 'origin' 等于 'COMPUTER'.
的所有交易
但我需要处理 XML 个超过 1 GB 的文件。
在那种情况下,它 'segmentation error' 因为它消耗大量内存。
因此,为了解决这个问题,我正在尝试实施 'purge' 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>
您可能应该使用 flush
(到文件名)而不是 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');
这会在文件中留下一些额外的空行,您可以稍后删除它们。 twig_roots
处理程序会为您需要删除的所有元素触发,并删除它们,而 twig_print_outside_roots
选项会导致打印所有其他元素 as_is.
我可能会问一个基本问题,但它让我很生气。
以下是我的代码片段
#!/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";
}
这是按预期工作的。它为我提供了 'origin' 等于 'COMPUTER'.
的所有交易但我需要处理 XML 个超过 1 GB 的文件。 在那种情况下,它 'segmentation error' 因为它消耗大量内存。
因此,为了解决这个问题,我正在尝试实施 'purge' 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>
您可能应该使用 flush
(到文件名)而不是 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');
这会在文件中留下一些额外的空行,您可以稍后删除它们。 twig_roots
处理程序会为您需要删除的所有元素触发,并删除它们,而 twig_print_outside_roots
选项会导致打印所有其他元素 as_is.