<?xml version="1.0" encoding="windows-1252"?>
<node id="1004123" title="Re: XML Newbie" created="2012-11-16 00:08:33" updated="2012-11-16 00:08:33">
<type id="11">
note</type>
<author id="1004120">
rcrews</author>
<data>
<field name="doctext">
&lt;p&gt;Assuming gibsonca.xml looks like this:&lt;/p&gt;

&lt;pre&gt;
&amp;lt;gibsonca&gt;
&amp;lt;abc&gt;fds &amp;lt;/abc&gt; &amp;lt;!-- ok --&gt;
&amp;lt;ddd&gt;&amp;lt;/ddd&gt; &amp;lt;!-- not ok --&gt;
&amp;lt;eee&gt; &amp;lt;/eee&gt; &amp;lt;!-- not ok --&gt;
&amp;lt;/gibsonca&gt;
&lt;/pre&gt;

&lt;p&gt;The following program will print "3" and "4".&lt;/p&gt;

&lt;pre&gt;
#!/opt/perl/bin/perl -T
use strict;
use warnings;
use Carp;
use English qw(-no_match_vars);
use Try::Tiny;
use XML::LibXML;

our $VERSION = '0.1';

my $file = 'gibsonca.xml';
my $dom;

open my $fh, '&lt;', $file
    or carp "Can't open $file: $OS_ERROR";

try {
    $dom = XML::LibXML-&gt;load_xml(
        {   IO           =&gt; $fh,
            line_numbers =&gt; 1,
        }
    );
}
catch {
    print "Error parsing $file";
};

close $fh
    or carp "Can't close $file: $OS_ERROR";

for my $e ( $dom-&gt;findnodes('//*') ) {

    my $t = $e-&gt;textContent();
    $t =~ s{\A \s+ \z}{}xms;

    if ( !$t ) {
        print $e-&gt;line_number() . "\n";
    }
}

exit 0;
__END__
&lt;/pre&gt;</field>
<field name="root_node">
1004080</field>
<field name="parent_node">
1004080</field>
</data>
</node>
