#!/usr/bin/env perl use warnings; use strict; use XML::LibXML; my $doc = XML::LibXML->load_xml( location => 'in.xml' ); my (@data, %maxlen); for my $food ( $doc->findnodes('/breakfast_menu/food') ) { my %elem; for my $t ( qw/ name price / ) { # assume only one of these elements each per my ($str) = $food->getElementsByTagName($t); $str = $str->textContent; $str =~ s/^\s*\$// if $t eq 'price'; if ( !defined $maxlen{$t} || length $str > $maxlen{$t} ) { $maxlen{$t} = length $str } $elem{$t} = $str; } push @data, \%elem; } @data = sort { $a->{name} cmp $b->{name} } @data; for my $elem (@data) { printf "%-$maxlen{name}s %$maxlen{price}.2f\n", $elem->{name}, $elem->{price}; } __END__ Belgian Waffles 5.95 Berry-Berry Belgian Waffles 8.95 French Toast 4.50 Homestyle Breakfast 6.95 Strawberry Belgian Waffles 7.95