我正在寻找一个可以编辑目录树中所有文件的程序,比如Unix系统上的Perl。这些文件是xml和另一个文件夹。
正则表达式应删除放置在<loot></loot>
括号中的所有内容。
例如文件
<?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>
答案 0 :(得分:1)
我会回避基于正则表达式的任何东西 - XML根本不适用于正则表达式。
但幸运的是,Perl for Windows随时可用。更好的是,如果你使用Strawberry perl,它会与XML::Twig
和XML::LibXML
捆绑在一起。
此时问题变得非常简单:
#!/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 ,
'_all_' => sub { $_ - > flush } } );
foreach my $file ( File::Find::Rule -> file()
-> name ( '*.xml.txt' )
-> in ( 'C:\tmp' ) ) {
print "Processing $file\n";
$twig -> parsefile_inplace($file);
}
当然,这个也假设您的XML实际上是XML - 您的示例并非如此。如果这个例子实际上是正确的,那么你应该真正击中那些用XML规范的卷起来编写它的人,同时唱颂“不要制作假的XML&#39;”。