use XML::Rules; # at least 0.22 (for the stripspaces) # see http://www.perlmonks.org/?node_id=658971 my $parser = XML::Rules->new( rules => [ Text => 'content', Entry => 'as array', Report => 'pass', Other => sub {return delete($_[1]->{name}) => $_[1]}, ], stripspaces => 3, ); my $data = $parser->parse(\*DATA); use Data::Dumper; print Dumper($data); __DATA__ Device Handle: 2 Device Handle: 5 Device Handle: 5 Device Handle: 5