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?
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.
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.
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);
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.
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_*').
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With