在Perl中,如何在不更改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&

我有一个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>
请告诉我怎么做

提前谢谢


我希望输出文件保存在同一目录中,如果可能的话,使用相同的名称。可能吗?

你试过了吗

来自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