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
####
xxx
a