我想清除放在<loot> </loot>目录树中XML文件中元素内的整个内容.我正在使用Strawberry Perl for Windows 64 bit.
例如,这个XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<monster name="Dragon"/>
<health="10000"/>
<immunities>
<immunity fire="1"/>
</immunities>
<loot>
<item id="1"/>
<item id="3"/>
<inside>
<item id="6"/>
</inside>
</item>
</loot>
Run Code Online (Sandbox Code Playgroud)
更改的文件应该是:
<?xml version="1.0" encoding="UTF-8"?>
<monster name="Dragon"/>
<health="10000"/>
<immunities>
<immunity fire="1"/>
</immunities>
<loot>
</loot>
Run Code Online (Sandbox Code Playgroud)
我有这个代码:
#!/usr/bin/perl
use warnings;
use strict;
use File::Find::Rule;
use XML::Twig;
sub delete_loot {
my ( $twig, $loot ) = @_;
foreach my $loot_entry ( $loot -> children ) {
$loot_entry -> delete;
}
$twig -> flush;
}
my $twig = XML::Twig -> new ( pretty_print => 'indented',
twig_handlers => { 'loot' => \&delete_loot } );
foreach my $file ( File::Find::Rule -> file()
-> name ( '*.xml' )
-> in ( 'C:\Users\PIO\Documents\serv\monsters' ) ) {
print "Processing $file\n";
$twig -> parsefile_inplace($file);
}
Run Code Online (Sandbox Code Playgroud)
但它只正确编辑它遇到的第一个文件,其余文件保持清晰(0 kb清除文件)
XML ::Twig 文档说“多枝没有得到很好的支持”。
如果您查看 twig 对象的状态(例如使用 Data::Dumper),您会发现第一次运行和后续运行之间存在很大差异。看起来它认为已经完全刷新了(这是真的,因为在第一次运行期间就完全刷新了)。它可能没有任何内容可以为后续文件打印,并且文件最终为空。
在每个循环中重新创建树枝对象对我有用:
#!/usr/bin/perl
use warnings;
use strict;
use File::Find::Rule;
use XML::Twig;
sub delete_loot {
my ( $twig, $loot ) = @_;
foreach my $loot_entry ( $loot -> children ) {
$loot_entry -> delete;
}
}
foreach my $file ( File::Find::Rule -> file()
-> name ( '*.xml' )
-> in ( '/home/dabi/tmp' ) ) {
print "Processing $file\n";
my $twig = XML::Twig -> new ( pretty_print => 'indented',
twig_handlers => { loot => \&delete_loot, } );
$twig -> parsefile($file);
$twig -> print_to_file($file);
}
Run Code Online (Sandbox Code Playgroud)
另外,我必须更改 XML 文件结构才能对其进行处理:
<?xml version="1.0" encoding="UTF-8"?>
<monster name="Dragon">
<health value="10000"/>
<immunities>
<immunity fire="1"/>
</immunities>
<loot>
<item id="1"/>
<item id="3">
<inside>
<item id="6"/>
</inside>
</item>
</loot>
</monster>
Run Code Online (Sandbox Code Playgroud)