Better structured XML would help! However you can do what you want by using what is effectively a state machine and deferring output until you can make the decision. Consider:
use strict; use warnings; use XML::Parser; my $xmlStr = <<'END_XML'; <doc> <customBucket></customBucket> <customDimensionName>Strategy</customDimensionName> <customBucketValueString>Test1</customBucketValueString> <customBucketEnd></customBucketEnd> <customBucket></customBucket> <customDimensionName>SubStrategy</customDimensionName> <customBucketValueString>Test2</customBucketValueString> <customBucketEnd></customBucketEnd> </doc> 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; } }
Prints:
<doc> <customBucket></customBucket> <customDimensionName>SubStrategy</customDimensionName> <customBucketValueString>Test2</customBucketValueString> <customBucketEnd></customBucketEnd> </doc>
In reply to Re: How to exclude certain blocks of an XML file using Perl and XML::Parser
by GrandFather
in thread How to exclude certain blocks of an XML file using Perl and XML::Parser
by kgullekson
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |