我有一个格式的XML文件:
<outer1>
<inner1>
<name>Stonecold</name>
<profession>warrior</profession>
<org>wwf</org>
</inner1>
<inner1>
<name>Shanebond</name>
<profession>Bowler</profession>
<org>newzealand</org>
</inner1>
<inner1>
<name>brain schemidit</name>
<profession>Chairman</profession>
<org>Google</org>
</inner1>
</outer1>
Run Code Online (Sandbox Code Playgroud)
我想改变的价值Shanebond来Shane Bond.
我正在使用XML::Simple,但结果是哈希.
我想要与输入文件相同的格式.例如:输出文件应如下所示:
<outer1>
<inner1>
<name>Stonecold</name>
<profession>warrior</profession>
<org>wwf</org>
</inner1>
<inner1>
<name>Shane Bond</name>
<profession>Bowler</profession>
<org>newzealand</org>
</inner1>
<inner1>
<name>brain schemidit</name>
<profession>Chairman</profession>
<org>Google</org>
</inner1>
</outer1>
Run Code Online (Sandbox Code Playgroud)
请告知如何做到这一点.
提前致谢.
我希望输出文件保存在同一目录中,如果可能的话,使用相同的名称.可能吗?
在阅读或操作XML文件时,XML :: Twig通常是我希望使用的第一个工具.
起初我认为它可能对你的要求有点过分但后来我注意到它确实附带了一个parsefile_inplace()选项:
use strict;
use warnings;
use XML::Twig;
XML::Twig->new(
pretty_print => 'indented',
twig_handlers => {
name => sub {
$_->set_text( 'Shane Bond' )->flush if $_->text eq 'Shanebond'
},
},
)->parsefile_inplace( 'data.xml', 'bak_*' );
Run Code Online (Sandbox Code Playgroud)
NB.如果您不想保留备份文件,请删除第二个arg('bak_*').
为什么要把它当作XML处理呢?为什么不只做一个正则表达式替换呢?
perl -pi -e 's/Shanebond/Shane Bond/' filename.xml
Run Code Online (Sandbox Code Playgroud)
这样就可以进行替换,并保持相同的文件名和所有内容。
XML::Simple具有允许您指定如何将输入转换为 Perl 数据结构以及如何输出该结构的选项:
#!/usr/bin/perl
use strict;
use warnings;
use XML::Simple;
my $xml_file = 'b.xml';
my $xml = XMLin(
$xml_file,
KeepRoot => 1,
ForceArray => 1,
);
$xml->{outer1}->[0]->{inner1}->[1]->{name} = 'Shane Bond';
XMLout(
$xml,
KeepRoot => 1,
NoAttr => 1,
OutputFile => $xml_file,
);
Run Code Online (Sandbox Code Playgroud)
XML::Simple如果您做任何有趣的事情,确实会有点麻烦,因为它的目的不是成为通用 XML 库,而是提供一种简单的方法来处理用 XML 编写的配置文件。
CPAN 有大量与XML 相关的模块。除非这是您必须处理的一次性问题,否则值得研究一些功能更强大、更适合的模块。