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