The following more cautious code seemed to work for me and should purge memory regularly. I worry that calling purge on every element which might purge something you still need around.
use strict;
use warnings;
use XML::Twig;
$|++;
my $twig = XML::Twig->new(
twig_handlers => {
# as noted in the documentation for end_tag_handlers ...
# "twig_handlers are called when an element is completely pars
+ed"
# so should be safe to purge here
'Book' => sub {
my ($twig, $el) = @_;
# print "purging ...\n";
$twig->purge;
},
'Book//*' => sub {
# see http://search.cpan.org/~mirod/XML-Twig-3.49/Twig.pm#
+cond
# for #ELT which is an element
print $_->tag, ': ', $_->text, $/
unless ($_->has_children('#ELT'));
}
}
);
$twig->parsefile('books.xml');
|