use strict; use XML::Rules; my $parser = XML::Rules->new( rules => { _default => 'content', 'sampling,sports' => 'content array', dataName => sub { return unless $_[1]->{language} eq 'English'; return $_[0] => $_[1]; }, place => sub { return unless $_[1]->{country} eq 'SouthAfrica'; print "Sampling: " . join( ', ', @{$_[1]->{dataName}{sampling}}) . "\n"; return; } } ); $parser->parse(\*DATA); __DATA__ SouthAfrica cricket rugby English 16000 11025 Africans 16000