我想清除放在< 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>
更改的文件应该是:
<?xml version="1.0" encoding="UTF-8"?> <monster name="Dragon"/> <health="10000"/> <immunities> <immunity fire="1"/> </immunities> <loot> </loot>
我有这个代码:
#!/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); }
解决方法
XML::Twig doc说“多枝没有得到很好的支持”.
如果您查看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); }
此外,我不得不更改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>