http://www.perlmonks.org?node_id=1004132


in reply to XML Newbie

An XML::Twig version that does not load the entire XML in memory:

#!/usr/bin/perl use strict; use warnings; use XML::Twig; my $t=XML::Twig->new( start_tag_handlers => { _all_ => \&store_line_number, }, twig_handlers => { _all_ => \&warn_on_empty_elt, }, ); $t->parsefile( "so_line_numbers.xml"); sub store_line_number { my( $twig, $elt)= @_; $elt->set_att( '#line' => $twig->current_line); $elt->parent->set_att( '#not_empty') if $elt->parent; } sub warn_on_empty_elt { my( $twig, $elt)= @_; if( ! $elt->att( '#not_empty') && $elt->text !~ m{\S}) { print $el +t->att( '#line'), "\n"; } $twig->purge; }

The little bit of cleverness here is that the code manages whether an element is empty or not itself, which allows it to purge the twig after each element (otherwise an enclosing element would have no content and trigger the warning).