use strict; use warnings; use XML::Simple; use Data::Dumper; my $xml = XMLin( 'depart.xml'); print Dumper $xml; print "First level of data\n"; for my $level1 (keys %$xml) { print "$level1\n"; } # assume you want flightStatuses print "Second level of data\n"; for my $level2 (keys %{ $xml->{flightStatuses} } ) { print "$level2\n"; } # only has flightStatus which is an array ref containing hashes, hint '=> [' print "Unsorted depature times\n"; for my $level3 ( @{ $xml->{flightStatuses}->{flightStatus} } ) { print $level3->{carrierFsCode}; print $level3->{flightNumber},": "; print $level3->{operationalTimes}->{scheduledGateDeparture}->{dateUtc},"\n"; } # now that we have the data we can sort print "Sorted depature times\n"; for my $level3 ( sort { $a->{operationalTimes}->{scheduledGateDeparture}->{dateUtc} cmp $b->{operationalTimes}->{scheduledGateDeparture}->{dateUtc} } @{ $xml->{flightStatuses}->{flightStatus} } ) { print $level3->{carrierFsCode}; print $level3->{flightNumber},": "; print $level3->{operationalTimes}->{scheduledGateDeparture}->{dateUtc},"\n"; }