use strict; use XML::Rules; my $parser = XML::Rules->new( rules => [ _default => 'content', 'other, Author' => 'as array', AuthorList => sub { return Authors => $_[1]->{Author} }, PubmedArticle => 'pass', ], stripspaces => 7, handlers => { Start => sub { my ( $Parser, $Element , %Attr) = @_; print "$Element\n"; # you can modify the elements of @_ for(my $i = 2;$i <= $#_; $i+=2) { $_[$i] = lc($_[$i]) }; #print "(@_)\n"; # and even add attributes push @_, blah => 666; }, Comment => sub {my ($Parser, $String) = @_; print "Found a comment: $String\n"}, } ); my $data = $parser->parse( \*DATA); use Data::Dumper; print Dumper($data); print "Authors:\n"; foreach my $author (@{$data->{Authors}}) { print "$author->{ForeName} $author->{LastName}\n"; } __DATA__ van Beilen J B JB Penninga D D Witholt B B