use warnings; use strict; use XML::Twig; use XML::XPath; # for findnodes my $filename = 'foo.xml'; XML::Twig->new( twig_print_outside_roots => 1, keep_spaces => 1, twig_roots => { '/TestCode/TestCategory/Test' => sub { my ($t, $elt) = @_; if ( $elt->{att}{name} =~ /^CheckType_/ ) { my @values = $elt->findnodes('./context/value'); # could theoretically also use XPath for the following if ( grep { $_->text =~ /XYZ/ } @values ) { $t->flush } else { $t->purge } } else { $t->purge } }, }, )->parsefile($filename);