use strict; use warnings; use XML::Simple; my $xml_raw = <<XML_RAW; <survey> <animals srcurl="blah.whatever.blah" method="ftp"> <fish name="barramundi" freshwater="yes" saltwater="yes"> <river>Todd</river> <river>Katherine</river> </fish> <fish name="carp" freshwater="yes" saltwater="no"> <river>Tilbuster Ponds</river> <river>Maribyrnong</river> <river>Patterson</river> <river>Paterson</river> <river>Glenelg</river> <river>Murray</river> <river>Bunyip</river> <river>Campaspe</river> </fish> <fish name="yellowfin" freshwater="yes" saltwater="no"> <river>Eucumbene</river> <river>Mulla Mulla Creek</river> <river>Burrungubugge</river> <river>Goobarragandra</river> <river>Bombala</river> <river>Murray</river> <river>Emu Swamp Creek</river> </fish> </animals> </survey> XML_RAW my $data = XMLin($xml_raw, ForceArray => [qw(river fish)], KeyAttr => []); foreach my $Animal (@{$data->{animals}{fish}}) { print <<"*END*"; [ Survey information for: $Animal->{name} ]: Saltwater:$Animal->{saltwater} Freshwater:$Animal->{freshwater} Rivers covered in survey: *END* for (@{$Animal->{river}}) { print $_, "\n"; } print "\n"; }