use strict; use warnings; use XML::Simple; my $xml = new XML::Simple; my $data = $xml->XMLin( \*DATA ); my %by_code; foreach my $dtc ( @{ $data->{DTC} } ) { push @{ $by_code{ $dtc->{TroubleCode} } }, $dtc; } foreach my $code ( sort { $a <=> $b } keys %by_code ) { print "trouble code: $code\n"; print "description:\n"; print map { $xml->XMLout( $_, RootName => 'DTC', NoAttr => 1, ) } @{ $by_code{$code} }; } __DATA__ Removed by request.