加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

使用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>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读