使用Strawberry Perl和twig清除Windows上目录树中所有文件的xml
发布时间:2020-12-16 06:24:29 所属栏目:大数据 来源:网络整理
导读:我想清除放在 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"//immunitiesl
我想清除放在< 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:UsersPIODocumentsservmonsters' ) ) { print "Processing $filen"; $twig -> parsefile_inplace($file); } 但它只正确编辑它遇到的第一个文件,其余文件保持清晰(0 kb清除文件) 解决方法
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 $filen"; 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> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |