以下是我将使用的XML:
<a>
<id>ABC</id>
<class />
<gender />
</a>
我想编写一个Perl代码,用于搜索标签'id'并将值“ABC”替换为“DEF”。
然而,上述XML的嵌套可能会发生变化。因此,我想制作一个通用代码,独立于其确切位置搜索标签'id'。
直到现在我能够得到逻辑,我可以替换ABC中的值,但这使我的代码静态标记'id'的位置。
#!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,
);
}
答案 0 :(得分:6)
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
答案 1 :(得分:3)
一个简单的XML :: Twig解决方案是:
#!/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 :: Twig解决方案有点复杂,主要是因为你不能将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');
答案 2 :(得分:-1)
perl -i.bak -pe&#39; s / abc / def / g&#39; myfile.xml中
您将获得一个新文件myfile.xml.bak,其中包含ha