use XML::Twig qw( ); # Assumptions # - "data" elements can't be nested. # - Only one twig instance is used at a time. my $prune_data; sub twig_data_start { my ($twig, $ele) = @_; $prune_data = 0; return 1; } sub twig_data_type { my ($twig, $ele) = @_; $prune_data = 1 if $ele->trimmed_text() eq 'yyy'; return 1; } sub twig_data { my ($twig, $ele) = @_; return 1 if !$prune_data; $prune_data = 0; $ele->delete(); return 0; } my $twig = XML::Twig->new( start_tag_handlers => { 'data' => \&twig_data_start, }, twig_handlers => { 'data' => \&twig_data, 'data/type' => \&twig_data_type, }, # Output will be nicely formatted, but not necessarily valid. pretty_print => 'indented', ); $twig->parse(\*DATA); $twig->print(); __DATA__ xxx a yyy b