为查找和替换XML标记值的Perl代码(Perl code for Find and replace

2019-06-26 06:53发布

下面是我将使用XML:

<a>

<id>ABC</id>

<class />

<gender />

</a>

我希望编写搜索标签“ID”,并与“DEF”替换值“ABC”一个Perl代码。

然而上述XML的嵌套可以改变。 所以我想做出一个通用的代码,搜索标签“身份证”独立的确切位置。

到现在为止,我能够得到的逻辑,我可以代替ABC的价值,但使我的代码静态标签“身份证”的位置。

#!usr/bin/perl
use warnings;
use XML::Simple;
use Spreadsheet::ParseExcel;
use Data::Dumper;
my $FileName = 'sample.xls';
my $xml_file = 'hello.xml';
$par=$ARGV[0];
my $xml = XMLin($xml_file,
    KeepRoot=>1,
    ForceArray=>1,);
$xml->{a}->[0]->{id}='DEF';
XMLout(
    $xml,
    KeepRoot =>1 ,
    NoAttr =>1,
    OutputFile => $xml_file,
        );
    }

Answer 1:

XPath是能够找到的节点,而不必知道在树中的位置。

use strictures;
use XML::LibXML qw();
my $dom = XML::LibXML->load_xml(string => <<'XML');
<a>
<id>ABC</id>
<class />
<gender />
</a>
XML

for my $id ($dom->findnodes('//id[string()="ABC"]')) {
    $id->removeChildNodes;
    $id->appendText('DEF');
}

print $dom->toString


Answer 2:

一个简单的XML ::嫩枝的解决办法是:

#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

my $FILE= 'id.xml';

XML::Twig->new( twig_handlers => { 'id[string()="ABC"]' => sub { $_->set_text( 'DEF'); } },
                keep_spaces => 1,
              )
          ->parsefile( $FILE)
          ->print_to_file( $FILE);

只是为了好玩:一个有效的XML ::嫩枝解决方案更令人费解的一点,主要是因为你不能使用string()与条件twig_roots 。 不过,这是相当紧凑的,它从不加载整个文件在内存中。

#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

XML::Twig->new( twig_roots =>    { id => sub { $_->flush }, },
                twig_handlers => { 'id[string()="ABC"]' => sub { $_->set_text( 'DEF'); } },
                twig_print_outside_roots => 1,
              )
          ->parsefile_inplace( 'id.xml');


Answer 3:

perl的-i.bak -pe的/ ABC / DEF / G'myfile.xml中

你会得到一个新的文件myfile.xml.bak其中哈



文章来源: Perl code for Find and replace a tag value in XML