use strict; use warnings; use XML::Rules; use Data::Dumper; my $parser = XML::Rules->new( rules => [ substrate => sub {return '@substrates' => $_[1]->{name}}, product => sub {return '@products' => $_[1]->{name}}, reaction => sub { my $name = delete($_[1]->{name}); delete($_[1]->{_content}); return $name => $_[1]; }, root => 'pass no content', ], ); my $result = $parser->parse(\*DATA); print Dumper($result); while (my ($reaction, $data) = each(%$result)) { print "$reaction ($data->{type})\n"; print "\tSubstrates: ", join(", ", @{$data->{substrates}}), "\n"; print "\tProducts: ", join(", ", @{$data->{products}}), "\n\n"; } __DATA__