Perl XML :: LibXML :: Schema остановит проверку при первой ошибке - PullRequest
1 голос
/ 08 июля 2010

Я пытаюсь использовать XML :: LibXML :: Schema для проверки xml-файла на xsd. Проблема в том, что если в моем xml-файле есть несколько семантических проблем, валидация умирает в первом случае, а в других нет.

<code></p>

<p>It finds the first error, no reference to <code><foobar/></code>
bash-3.2$ ./test.pl test.xsd test.xml 
xmlfile <code><test.xml></code> failed validation: test.xml:14: Schemas validity error : Element 'foobar': This element is not expected.</p>

<p>After I remove the first error, it finds another. "ten" is not an unsigned int
xmlfile <code><test.xml></code> failed validation: test.xml:11: Schemas validity error : Element 'allocation': 'ten' is not a valid value of the atomic type 'xs:unsignedInt'.</p>

<p>Changing "ten" to 10 fixes this issue
bash-3.2$ ./test.pl test.xsd test.xml 
No issues found</p>

<p>

Я хотел бы получить отчет обо всех проблемах за один раз. Есть идеи? Должен ли я использовать другой модуль для этого? Следует моему сценарию Perl и моим файлам xsd и xml.

Спасибо за вашу помощь,

1011 * Пауло *

</p>

<p>xsd:</p>

<pre><code> <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>

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:

#!/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"; }

Ответы [ 2 ]

2 голосов
/ 08 июля 2010

Попробуйте передать recover => 1 в XML::LibXML->new.Это может помочь.

Документы от XML :: LibXML :: Parser ...

   recover
       /parser, html, reader/

       recover from errors; possible values are 0, 1, and 2

       A true value turns on recovery mode which allows one to parse
       broken XML or HTML data. The recovery mode allows the parser to
       return the successfully parsed portion of the input document. This
       is useful for almost well-formed documents, where for example a
       closing tag is missing somewhere. Still, XML::LibXML will only
       parse until the first fatal (non-recoverable) error occurs,
       reporting recoverable parsing errors as warnings. To suppress even
       these warnings, use recover=>2.

       Note that validation is switched off automatically in recovery
       mode.
1 голос
/ 11 июля 2010

С мной связался сопровождающий XML :: LibXML и заполнил это как исправление ошибки. Оказывается, вы можете получить несколько сообщений об ошибках с помощью утилиты командной строки xmllint:

</p>

<pre><code>$ 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...