I have the following Perl code, which reads the input and indents the file correctly. I’m not using xmllint, or XML-Tidy because of some problems with the DTD. But let’s say for exercise I’ve use the code below:
### begin_: file metadata
### <region-file_info>
### main:
### - name : XMLPrettyPrint: simple xml pretty print in perl
### desc : use perl with XML::Twig library to print indented xml
### date : created="Thu 2005-12-01 11:08:15"
### last : lastmod="Thu 2005-12-01 11:22:34"
### lang : perl
### tags : perl xml indent formatted pretty string cfPrettyPrint
### </region-file_info>
### begin_: init perl
use strict;
use warnings;
use XML::Twig;
### begin_: init vars
my $sXML = join "", (<DATA>);
### init params
my $params = [qw(none nsgmls nice indented record record_c)];
my $sPrettyFormat = $params->[3] || 'none';
### begin_: process
my $twig= new XML::Twig;
$twig->set_indent(" "x2);
$twig->parse( $sXML );
$twig->set_pretty_print( $sPrettyFormat );
$sXML = $twig->sprint;
### begin_: output
print $sXML;
### begin_: sample data
1;
__END__
<table><tr age="35" >
<fname>Homer</fname>
<lname>Simpson</lname></tr>
<tr age="33" >
<fname>Barney</fname>
<lname>Rubble</lname></tr>
<tr age="29" >
<fname>Betty</fname>
<lname>Rubble</lname></tr></table>
It indents and print is correctly … however, I needed to read it from an XML file, indent and then right it back to the same file, with the new format. I’m totally new to Perl, how could I read the input from a file, instead of a sample data, and then use that above code to indent?
Thanks
How about
No need to set the indent to 2 spaces, that’s the default. The 1 at the end is also not needed, it is only needed for modules, to inform the parser that they have loaded properly.
This is also equivalent to
xml_pp -i myfile.xml