squareroot3 has asked for the wisdom of the Perl Monks concerning the following question:

hi all,
I got a weird problem when i am using XML::Checker::Parser.
I am using that to validate XML against a DTD file.
My code is here:
use XML::Checker::Parser; my %expat_options = (KeepCDATA => 1, Handlers => [ Unparsed => \&my_Unparsed_handler +]); my $parser = new XML::Checker::Parser (%expat_options); eval { local $XML::Checker::FAIL = \&my_fail; $parser->parsefile ("fail.xml"); }; if ($@) { print $@; } else{ print "xml has been validated"; } sub my_fail { my $code = shift; die XML::Checker::error_string ($code, @_) if $code < 200; XML::Checker::print_error ($code, @_); }
the xml file is here :
<!DOCTYPE a [ <!ELEMENT a (b,c!)> <!ELEMENT b (#PCDATA)> <!ELEMENT c (#PCDATA)> ]> <a> "something should not be here" <b></b> <c></c> </a>
In this case, there should be an error msg to be printed,
but the script just pass the xml though the validation.
Does anyone know what's going on here?

Replies are listed 'Best First'.
Re: Problem using XML::Checker::Parser
by GrandFather (Saint) on Aug 08, 2007 at 01:42 UTC

    First off, the XML::Checker version 0.13 documentation is wrong. Its example implies an array ref should be used with 'Handlers', but it needs a hash.

    Second, XML::Checker does not find your DTD palatable. It gets upset by the ! following the c in <!ELEMENT a (b,c!)>.

    With those two issues cleaned up:

    use strict; use warnings; use XML::Checker::Parser; my %expat_options = ( KeepCDATA => 1, Handlers => {Unparsed => \&my_Unparsed_handler} ); my $parser = new XML::Checker::Parser(%expat_options); open OUT, '>', 'fail.xml'; print OUT <<OUT; <!DOCTYPE a [ <!ELEMENT a (b,c)> <!ELEMENT b (#PCDATA)> <!ELEMENT c (#PCDATA)> ]> <a> "something should not be here" <b></b> <c></c> </a> OUT close OUT; eval { local $XML::Checker::FAIL = \&my_fail; $parser->parsefile("fail.xml"); }; if ($@) { print $@; } else { print "xml has been validated"; } sub my_fail { my $code = shift; die XML::Checker::error_string( $code, @_ ) if $code < 200; XML::Checker::print_error( $code, @_ ); }

    Prints:

    XML::Checker ERROR-149: Element should only contain sub elements, foun +d text ["something should not be here"] Context: line 7, column 0, byte 104

    DWIM is Perl's answer to Gödel
      1st thank u. I have tested it, but the code is not working for me.
      do u know any setting could cause that problem?
    A reply falls below the community's threshold of quality. You may see it by logging in.