Let’s say you’ve got a file named “file.xml” and want it pretty printed, all indented nice and everything…
For just such an occasion I have a Perl script named “pretty.pl” and I just run my XML file through it like so: cat file.xml | perl pretty.pl
Here’s the code I use:
#!/usr/bin/perl use XML::Twig; use XML::Parser; my $xml = XML::Twig->new(pretty_print => 'indented'); $xml->parse(\*STDIN); $xml->print();
You can even pass it through right as it comes in over the wire: curl http://example.com/data/file.xml | perl pretty.pl
Here’s an example of data from Foursquare without pretty printing. (I used curl to grab the data. Also, I added in some line breaks, just to make it a little more readable.):
<?xml version="1.0" encoding="UTF-8"?> <checkins><checkin><id>123847273</id> <created>Mon, 09 Aug 10 00:50:33 +0000</created> <timezone>America/Chicago</timezone><venue><id>2357761</id> <name>The Kiltie</name><primarycategory><id>79067</id> <fullpathname>Food:Ice Cream</fullpathname><nodename>Ice Cream</nodename> <iconurl>http://foursquare.com/img/categories/food/icecream.png</iconurl> </primarycategory><address></address><city></city><state></state> <geolat>43.107391</geolat><geolong>-88.464475</geolong></venue> <display>Pete P. @ The Kiltie</display></checkin></checkins>
And here’s the same data, again using curl to grab it, and then passing it through the pretty.pl script:
<?xml version="1.0" encoding="UTF-8"?>
<checkins>
<checkin>
<id>123847273</id>
<created>Mon, 09 Aug 10 00:50:33 +0000</created>
<timezone>America/Chicago</timezone>
<venue>
<id>2357761</id>
<name>The Kiltie</name>
<primarycategory>
<id>79067</id>
<fullpathname>Food:Ice Cream</fullpathname>
<nodename>Ice Cream</nodename>
<iconurl>http://foursquare.com/img/categories/food/icecream.png</iconurl>
</primarycategory>
<address></address>
<city></city>
<state></state>
<geolat>43.107391</geolat>
<geolong>-88.464475</geolong>
</venue>
<display>Pete P. @ The Kiltie</display>
</checkin>
</checkins>
I still find Perl extremely useful for this sort of task… I’m sure there are other command line ways to do this, but this one works for me.
(Hat tip to A Curious Programmer where I picked up this Perl code from…)
