使用perl搜索并替换xml中的特定代码

时间:2015-05-20 15:16:56

标签: xml perl search replace

我是Perl的新手,我有一个任务是替换或删除多个XML文件中的注释部分(<!--),替换后我需要将这些多个XML文件移动到其他目录。我在我的D:\folder1\下方有许多xml文件a.xmlb.xmlc.xml等等,在替换后我需要将所有文件从folder1移到D:\folder2\

我通过替换-@@@尝试了一个文件,但我不想从目录中的xml文件中删除评论行(<!--add aaa -->)。

我的Perl代码如下

#!/usr/bin/perl

use strict;
use warnings;

my $tag = 'SHORT_DESC';

open my $input_file, '<', 'test.xml' or die $!;
open my $output_file, '>', 'test_out.xml' or die $!;

my $input;
{
  local $/;               #Set record separator to undefined.
  $input = <$input_file>; #This allows the whole input file to be read at once.
}

$input =~ s/&/@@@/g;
$input =~ s/^- (?=<)//gm;
$input =~ s/<header[^>]*>\K\s*<header[^>]*>//gis;
close $input_file or die $!;
print {$output_file} $input;
close $output_file or die $!;

我的XML是

<?xml version = '1.0' encoding = 'UTF-8'?>
<!-- Order details-->
<order>
<Names>
<!-- Names-->
<content>This is dummy content</content>
</Names>
</order>

1 个答案:

答案 0 :(得分:3)

使用正确的XML处理模块。我喜欢XML::XSH2XML::LibXML的包装:

#! /usr/bin/perl
use warnings;
use strict;

use XML::XSH2;   # To handle XML.
use Path::Tiny;  # To move files around.

my ($source, $target) = @ARGV;

for my $file (path($source)->children(qr/\.xml$/)) {
    xsh "open $file ; delete //comment() ; save";
    path($file)->copy($target);
    path($file)->remove;
}