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