【问题标题】:Search and replace specific code in xml using perl使用 perl 搜索和替换 xml 中的特定代码
【发布时间】:2015-08-01 22:41:20
【问题描述】:

我是 Perl 新手,我的任务是替换或删除多个 XML 文件中的注释部分 (<!--),替换后我需要将这些多个 XML 文件移动到其他目录。我在下面说明我的D:\folder1\ 有许多xml 文件a.xml、b.xml、c.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>

【问题讨论】:

  • 您是否因为特定原因而错误地输入了 XML cmets?为什么引用@@@?另外,my $input = do { local $/; &lt;$input_file&gt; };。另外,您没有使用 UTF-8 层阅读。
  • 这样的文件我没有输入
  • 您是否声称文件中的 cmets 按字面意思使用 &lt;\!--?在这种情况下,它们不是 XML。
  • 思南我的要求是从文件中删除该注释行,它的纯xml文件,示例目的我更改了代码。

标签: xml perl search replace


【解决方案1】:

使用适当的 XML 处理模块。我喜欢XML::XSH2,是XML::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;
}

【讨论】:

  • 谢谢,你能指导我在哪里包含源和目标文件夹路径,如何将 xsh2 模块包含到程序中,其他方法可能可以实现我的任务。
  • @NachiappanR:源目录和目标目录应指定为脚本的参数。
  • 谢谢 choroba,你能说我是否需要包含 xsh2 模块,如果需要请告诉我过程。
  • 即使我在命令提示符下使用 ppm install xsh2 安装 xsh2,但我遇到错误 Can't locate XML/XSH2.pm in @INC(您可能需要安装 XML::XSH2 模块)(@INC 包含:C:/Perl/site/lib C:/Perl/lib 。)在 searcn.pl 第 5 行。BEGIN 失败——编译在 hello.pl 第 5 行中止。
  • 我希望代码能正常工作,但唯一的问题是如何包含模块 XSH2,还有其他方法可以包含相同的任务吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-03
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 2018-08-21
  • 2023-03-30
相关资源
最近更新 更多