xmlperl

In Perl, how can I change the content of an element in an XML file without changing the format of the XML?


I have a XML file of the format:

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

I want to change the value of Shanebond to Shane Bond.

I was using XML::Simple, but the result was a hash.

I want the same format as the input file. E.g: the output file should be as follows:

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

Please advice how to do this.

Thanks in advance.

I want the output file to be saved in the same directory and if possible with the same name. is it possible?


Solution

  • XML::Simple has options that allow you to specify how input will be transformed into a Perl data structure and how that structure will be output:

    #!/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::Simple does get a little hairy if you do anything interesting because its purpose is not to be a general purpose XML library but to provide a simple way to deal with configuration files written in XML.

    CPAN has a plethora of XML related modules. Unless this was a one-off issue you had to deal with, it would be worth looking into some of the more capable and better suited modules.