use strict; use warnings; use XML::Twig; use Data::Dumper; my $xmlStr = < XML my %data; my $twig= new XML::Twig( twig_handlers => { reporter => \&reporter } ); $twig->parse($xmlStr); print Dumper(\%data); exit; sub reporter { my ($twig, $rep) = @_; my $name = $rep->att('name'); my $sname = $rep->att('systematic_name'); my $pname = $rep->first_child('gene')->att('primary_name'); $data{$name} = [$name, $sname, $pname]; } __END__ $VAR1 = { 'A_24_P344666' => [ 'A_24_P344666', 'NM_020341', 'PAK7' ], 'foo' => [ 'foo', 'boo', 'goo' ] };