例如,这个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/perluse 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); }
但它只正确编辑它遇到的第一个文件,其余文件保持清晰(0 kb清除文件)
解决方法 XML::Twig doc说“多枝没有得到很好的支持”.如果您查看twig对象的状态(例如,使用Data :: Dumper),您会看到第一次和后续运行之间存在很大差异.看起来它认为已经完全冲洗了(这是真的,因为在第一次运行期间有完全冲洗).它可能没有什么可以打印后续文件,文件最终为空.
在每个循环中重新创建树枝对象对我有用:
#!/usr/bin/perluse 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>总结
以上是内存溢出为你收集整理的使用Strawberry Perl和twig清除Windows上目录树中所有文件的xml括号中的内容全部内容,希望文章能够帮你解决使用Strawberry Perl和twig清除Windows上目录树中所有文件的xml括号中的内容所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)