Package: libxml-libxml-perl
Version: 1.58-0.3
Severity: normal

Hi,

the XML::LibXML::SAX parser does not raise an exception by default when
parsing invalid XML syntax. The other available SAX parsers on my
system, XML::LibXML::SAX::Parser (from the same libxml-libxml-perl
package) and XML::SAX::PurePerl (from libxml-sax-perl) do raise
exceptions by default, so this is inconsistent behaviour. 

I'm attaching a test script that shows the problem. It defines a simple
XML handling class, MyHandler, which is derived from XML::SAX::Base,
and uses it to parse an invalid XML document with different SAX
parsers. The result output is:

%./saxtest.pl
Trying parser XML::LibXML::SAX::Parser...OK: got exception

Trying parser XML::SAX::PurePerl...OK: got exception

Trying parser XML::LibXML::SAX...ERROR: no exception


When called with the '-2' parameter, it uses another handling class,
MyHandler2, that differs from MyHandler only in that it has an explicit
'error' method. The resulting output is now;

% ./saxtest.pl  -2
Trying parser XML::LibXML::SAX::Parser...OK: got exception

Trying parser XML::SAX::PurePerl...OK: got exception

Trying parser XML::LibXML::SAX...OK: got exception

(There's also a "-v" parameter that shows the error string, in case you
want to verify the cause of the exception.)

Note that XML::LibXML::SAX is the default SAX parser when
libxml-libxml-perl is installed, so it would seem even more important
for it to do the Right Thing.

I ran into the problem while inspecting test failures in libxtm-perl,
bug #249234. I'll send details there shortly.

Cheers,
-- 
Niko Tyni               [EMAIL PROTECTED]
#!/usr/bin/perl -w

use strict;
use XML::SAX;
use XML::SAX::ParserFactory;
use XML::LibXML::SAX;
use Getopt::Std;

my %opts;
getopts('2v', \%opts);

my @parsers = map { $_->{Name} } @{XML::SAX->parsers()};

my $h;
if ($opts{2}) {
        $h = new MyHandler2;
} else {
        $h = new MyHandler;
}

for (@parsers) {
        print "Trying parser $_...";

        local $XML::SAX::ParserPackage = $_;

        my $p = XML::SAX::ParserFactory->parser(Handler => $h);

        eval { $p->parse_string(q|<?xml version="1.0"?><a/><a/>|) };
        if ($@) {
                print "OK: got exception\n";
                print $@ if $opts{v};
        } else {
                print "ERROR: no exception\n";
        }
        print "\n";
}


package MyHandler;
use base qw(XML::SAX::Base);

1;

package MyHandler2;
use base qw(XML::SAX::Base);

sub error {
        my $self = shift;
        die(shift);
}

1;

Reply via email to