在Perl中,如何在不更改XML文件格式的情况下更改XML文件中的元素?
我有一个XML文件,格式如下:在Perl中,如何在不更改XML文件格式的情况下更改XML文件中的元素?,xml,perl,Xml,Perl,我有一个XML文件,格式如下: <outer1> <inner1> <name>Stonecold</name> <profession>warrior</profession> <org>wwf</org> </inner1> <inner1> <name>Shanebond&
<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>
请告诉我怎么做
提前谢谢
我希望输出文件保存在同一目录中,如果可能的话,使用相同的名称。可能吗?你试过了吗 来自XML::Simple:
XMLout()的默认行为是将XML作为字符串返回。如果希望将XML写入文件,只需使用“OutputFile”选项提供文件名即可。
此选项还接受IO句柄对象-在Perl 5.8.0及更高版本中,对于使用UTF-8以外的编码输出尤其有用,例如: 具有允许您指定如何将输入转换为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,
);
如果您做了一些有趣的事情,它会有点麻烦,因为它的目的不是成为一个通用的XML库,而是提供一种简单的方法来处理用XML编写的配置文件
CPAN有过多的问题。除非这是您必须处理的一次性问题,否则值得研究一些功能更强大、更适合的模块。当涉及到读取或操作XML文件时,我通常会首先使用它 起初,我认为这可能是对您的需求的过度使用,但后来我注意到它确实附带了一个parsefile_inplace()选项:
注意。如果不想保留备份文件,请删除第二个参数('bak_*')。为什么要麻烦将其作为XML处理?为什么不直接替换regexp呢
perl -pi -e 's/Shanebond/Shane Bond/' filename.xml
这将进行替换,保留相同的文件名和所有内容。xml文件是一个配置文件,使用它的组件无法读取哈希文件。另外,如果在创建文件后其格式发生更改,则组件也无法从配置文件xmlin->process contents->xmlout中读取值。我希望输出文件保存在同一目录中,如果可能,使用相同的名称。有可能吗?@pchakraborty当然有可能。Nifle甚至展示了如何做到这一点。文档清楚地解释了
OutputFile
。一定要偶尔读一读:它们很有帮助。我试过了,效果很好。我必须在主代码中插入它,然后检查结果。谢谢你的帮助。我试过这个,它工作正常。我必须在主代码中插入它,然后检查结果。谢谢你的帮助。
#!/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,
);
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_*' );
perl -pi -e 's/Shanebond/Shane Bond/' filename.xml