xml - 使用 Strawberry Perl 和 twig 清除 Windows 上目录树中所有文件中 xml 括号中的内容

标签 xml perl xml-twig

我想清除 <loot> 中的全部内容</loot>目录树中 XML 文件中的元素。我正在使用适用于 64 位 Windows 的 Strawberry Perl。

例如这个 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); 
}

但它只正确编辑它遇到的第一个文件,其余文件保持清晰(0 kb 清晰文件)

最佳答案

XML::Twig doc说“多个 Twig 没有得到很好的支持”。

如果您查看 twig 对象的状态(例如使用 Data::Dumper),您会发现第一次运行和后续运行之间存在很大差异。看起来它认为它已经被完全刷新了(这是真的,因为在第一次运行期间有一个完全刷新)。对于后续文件,它可能没有更多要打印的内容,文件最终为空。

在每个循环中重新创建 Twig 对象对我有用:

#!/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>

关于xml - 使用 Strawberry Perl 和 twig 清除 Windows 上目录树中所有文件中 xml 括号中的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41426375/

相关文章:

javascript - 你如何在 javascript 中使用多个引号?

html - 用于 html 的 Perl 正则表达式

perl - 如何安装一组 Perl 模块的特定版本?

xml - XML::Twig 或其他中的 XPath 变量

XML::Twig 正在为多行中提供的值添加空换行符

xml - 以结构化 XML 格式输出完整的 Drupal 页面

xml - 尝试对服务器进行身份验证时通过对等方重置连接

perl - 在perl中读取文件时删除特殊字符

perl - 如何使用 XML::Twig 显示祖先?

android - 我可以始终使用 lint 忽略 NewApi 而不是不同的 styles.xml 文件吗?