Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

xml

perl

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?

like image 901
PJ. Avatar asked Aug 25 '09 11:08

PJ.


People also ask

How do I customize XML?

Create a new XML or XSLT fileFrom the File menu, select New. The New File dialog box appears. Select XML File to create a new XML file; or, select XSLT File to create a new XSLT style sheet. Select Open.

How do I change XML code?

Open the file you wish to edit by double clicking the file name. The file will open and display the existing code. Edit your XML file. Review your editing.

How do I read an XML file in Perl?

If you have the XML in a string, instead of location , use string : $dom = XML::LibXML->load_xml(string => $xml_string); Or, you can provide a Perl file handle to parse from an open file or socket, using IO : $dom = XML::LibXML->load_xml(IO => $fh);

What is Perl in XML?

Perl is a mature but eccentric programming language that is tailor-made for text manipulation. XML is a fiery young upstart of a text-based markup language used for web content, document processing, web services, or any situation in which you need to structure information flexibly.


3 Answers

When it comes to reading or manipulating a XML file then XML::Twig is often the first tool I look to use.

At first I thought it maybe an overkill for your requirement but then I noticed it did come with a parsefile_inplace() option:

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_*' );

NB. If you don't want to keep a backup file then remove the second arg ('bak_*').

like image 185
draegtun Avatar answered Oct 07 '22 22:10

draegtun


Why bother processing it as XML at all? Why not just do a regexp-replace?

perl -pi -e 's/Shanebond/Shane Bond/' filename.xml

That will do the replacement in place, keeping the same filename and everything.

like image 32
Peter Kovacs Avatar answered Oct 07 '22 22:10

Peter Kovacs


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.

like image 28
Sinan Ünür Avatar answered Oct 08 '22 00:10

Sinan Ünür