use strict; use XML::Rules; my $parser = XML::Rules->new( rules => { _default => 'content', '^residues' => sub { my ($tag,$attr,$context,$parents) = @_; return ($context->[-1] eq 'feature' and $parents->[-1]{feature_name} eq 'feature_one'); }, 'residue' => sub { my ($tag,$attr) = @_; print "$attr->{residue_index} $attr->{residue_name}\n" }, } ); $parser->parse(\*DATA); __DATA__ ...