use strict;
use warnings;
use XML::Parser;
my $xmlStr = <<'END_XML';
Strategy
Test1
SubStrategy
Test2
END_XML
my %state = (printing => 1);
my $parser = XML::Parser->new (Style => 'Stream', Pkg => '::main');
$parser->parse ($xmlStr);
sub StartTag {
my ($p, $elt) = @_;
my $eltStr = $_;
if ($elt eq 'customBucket') {
$state{printing} = undef;
} elsif ($elt eq 'customDimensionName') {
$state{capturing} = 1;
$state{capture} = '';
}
if ($state{printing}) {
print $eltStr;
} else {
$state{text} .= $eltStr;
}
}
sub Text {
my ($p) = @_;
my $str = $_;
if ($state{printing}) {
print $str;
} else {
$state{text} .= $str;
$state{capture} .= $str if $state{capturing};
}
}
sub EndTag {
my ($p, $elt) = @_;
my $eltStr = $_;
if ($state{printing}) {
print $eltStr;
} else {
$state{text} .= $eltStr;
}
if ($elt eq 'customBucketEnd') {
if ($state{capture} !~ '^Strategy$') {
print "$state{text}";
}
$state{text} = '';
$state{capture} = '';
$state{printing} = 1;
} elsif ($elt eq 'customDimensionName') {
$state{capturing} = undef;
}
}
####
SubStrategy
Test2