下面是我将使用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,
);
}
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
一个简单的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');
perl的-i.bak -pe的/ ABC / DEF / G'myfile.xml中
你会得到一个新的文件myfile.xml.bak其中哈