RE: XML::LibXML::Schema will stop validation on first error
"Paulo SantAnna" <[email protected]>
| Newsgroups | gmane.comp.lang.perl.xml |
|---|---|
| Message-ID | <001d01cb1f9b$4fb07f30$ef117d90$@com> |
Hi Petr,
Thanks for this response. It works!
$ xmllint --schema test.xsd test.xml
<?xml version="1.0" encoding="UTF-8"?>
<request xmlns:xsd="http://www.w3.org/2001/XMLSchema" type="test">
<channel name="channel">
<username>user</username>
<password>pass</password>
</channel>
<hotel id="ten">
<date from="2009-07-07" to="2009-07-17"/>
<room id="1">
<allocation>10</allocation>
</room>
</hotel>
<foobar/>
</request>
test.xml:8: element hotel: Schemas validity error : Element 'hotel', attribute 'id': 'ten' is not a valid value of the atomic type 'xs:unsignedInt'.
test.xml:14: element foobar: Schemas validity error : Element 'foobar': This element is not expected.
test.xml fails to validate
I will file in the bug report and look into the code to see if I can provide a patch as well. :-)
Thanks for your help!
Paulo
-----Original Message-----
From: [email protected] [mailto:[email protected]] On Behalf Of Petr Pajas
Sent: Thursday, July 08, 2010 6:26 PM
To: Paulo SantAnna
Cc: [email protected]
Subject: Re: XML::LibXML::Schema will stop validation on first error
Hello Paulo,
you can try using xmllint --schema to check if libxml2 supports
multiple error reporting. If yes, then XML::LibXML::Schema should be
able to support this too without much effort and you can file a bug at
rt.cpan.org so that it's not forgotten (I cannot promise to address it
any soon, though, but I have allocated sime time for XML::LibXML
during the next two weekends; even better, I'll gladly accept a
patch:-)).
OTOH, if libxml2 does not support this, than you may ask how if this
is hard to implement at [email protected], but note that AFAIK libxml2
development w.r.t. schema is in a "bug-fix-only mode" since the lead
developer in this area left the project some time ago.
-- Petr
2010/7/8 Paulo SantAnna <[email protected]>:
> With the script inline this time:
> xsd:
> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
> <!-- channel -->
> <xsd:element name="channel">
> <xsd:complexType>
> <xsd:sequence>
> <xsd:element name="username" type="xsd:string"/>
> <xsd:element name="password" type="xsd:string"/>
> </xsd:sequence>
> <xsd:attribute name="name" use="required" type="xsd:string" />
> </xsd:complexType>
> </xsd:element>
> <!-- hotel -->
> <xsd:element name="hotel">
> <xsd:complexType>
> <xsd:sequence>
> <xsd:element name="date">
> <xsd:complexType>
> <xsd:attribute name="from" use="required" type="xsd:string" />
> <xsd:attribute name="to" use="required" type="xsd:string" />
> </xsd:complexType>
> </xsd:element>
> <xsd:element ref="room" minOccurs="1"/>
> </xsd:sequence>
> <xsd:attribute name="id" use="required" type="xsd:unsignedInt" />
> </xsd:complexType>
> </xsd:element>
>
> <!-- room -->
> <xsd:element name="room">
> <xsd:complexType>
> <xsd:sequence>
> <xsd:element name="allocation" type="xsd:unsignedInt"></xsd:element>
> </xsd:sequence>
> <xsd:attribute name="id" use="required" type="xsd:string" />
> </xsd:complexType>
> </xsd:element>
> <!-- building all together -->
> <xsd:element name="request">
> <xsd:complexType>
> <xsd:sequence>
> <xsd:element ref="channel" maxOccurs="1"/>
> <xsd:element ref="hotel" maxOccurs="1"/>
> </xsd:sequence>
> <xsd:attribute name="type" use="required" type="xsd:string" />
> </xsd:complexType>
> </xsd:element>
> </xsd:schema>
> xml:
> <?xml version="1.0" encoding="UTF-8"?>
> <request type="test" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
> <channel name="channel">
> <username>user</username>
> <password>pass</password>
> </channel>
> <hotel id="ten">
> <date from="2009-07-07" to="2009-07-17"/>
> <room id="1">
> <allocation>ten</allocation>
> </room>
> </hotel>
> </request>
> perl script:
> #!/usr/bin/perl
> use strict;
> use warnings;
> use Data::Dumper;
> #use Carp;
> use vars qw( $xsd $xml $schema $parser $doc );
> use XML::LibXML;
>
> #
> # MAIN
> #
> my $xsd = $ARGV[0];
> my $xml = $ARGV[1];
>
> $schema = XML::LibXML::Schema->new(location => $xsd);
> $parser = XML::LibXML->new;
> $doc = $parser->parse_file($xml);
> eval { $schema->validate($doc) };
> if ( $@ ) {
> warn "xmlfile <$xml> failed validation: $@" if $@; exit(1);
> }
> else { print "No issues found\n"; }
>
>
> On Thu, Jul 8, 2010 at 1:01 PM, Paulo SantAnna <[email protected]> wrote:
>>
>> Hello,
>> I'm trying to use the XML::LibXML::Schema to validate a xml file against a
>> xsd. The problem is if my xml has multiple semantic issues the validation
>> will die on the first one and not report the others.
>> # Find the first error, no reference to <foobar/>
>> bash-3.2$ ./test.pl test.xsd test.xml
>> xmlfile <test.xml> failed validation: test.xml:14: Schemas validity error
>> : Element 'foobar': This element is not expected.
>> # Removing the first error it finds another "ten" is not an unsigned int
>> xmlfile <test.xml> failed validation: test.xml:11: Schemas validity error
>> : Element 'allocation': 'ten' is not a valid value of the atomic type
>> 'xs:unsignedInt'.
>> # Changing "ten" to 10 fixes this issue
>> bash-3.2$ ./test.pl test.xsd test.xml
>> No issues found
>>
>> I would like to get a report of ALL the issues. Any ideas? Should I be
>> using another module for this? I have attached my Perl script and my xsd and
>> xml files.
>> Thanks for your help,
>> Paulo
>
> _______________________________________________
> Perl-XML mailing list
> [email protected]
> To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs
>
>
No virus found in this incoming message.
Checked by AVG - www.avg.com
Version: 9.0.830 / Virus Database: 271.1.1/2988 - Release Date: 07/08/10 14:36:00
_______________________________________________
Perl-XML mailing list
[email protected]
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs