【问题标题】:Can't validate XML with XML schema and Perl (XML::LibXML)无法使用 XML 架构和 Perl (XML::LibXML) 验证 XML
【发布时间】:2012-06-16 14:29:00
【问题描述】:

xml:

<?xml version="1.0"?>
<workers xmlns="http://www.zoo.com" 
         xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
     xs:schemaLocation="http://www.zoo.com worker.xsd">
<impiegato>
    <username>mario</username>
    <password>de2f15d014d40b93578d255e6221fd60</password>
    <nome>Mario</nome>
    <sesso>F</sesso>
    <eta>23</eta>
</impiegato>
<impiegato>
    <username>maria</username>
    <password>maria</password>
    <nome>Mariaaa</nome>
    <sesso>F</sesso>
    <eta>443</eta>
</impiegato>
<impiegato>
    <username>mirco</username>
    <password>mirco</password>
    <nome>Mirco</nome>
    <sesso>F</sesso>
    <eta>27</eta>
</impiegato>
<impiegato>
    <username>martina</username>
    <password>martina</password>
    <nome>Martina</nome>
    <sesso>M</sesso>
    <eta>26</eta>
</impiegato>
<manager>
    <username>marco</username>
    <password>marco</password>
    <nome>Marco</nome>
    <sesso>M</sesso>
    <eta>25</eta>
</manager>
<manager>
    <username>giovanna</username>
    <password>zxVcGz0BPdHkY</password>
    <nome>Giovanna</nome>
    <sesso>F</sesso>
    <eta>24</eta>
</manager>
<manager>
<username>lucanervi</username>
    <password>zxePlNSDQjsxg</password>
    <nome>Luca Nervi</nome>
    <sesso>M</sesso>
    <eta>23</eta>
</manager>
</workers>

XML 架构:

<?xml version="1.0"?>
<xs:schema
 xmlns:xs="http://www.w3.org/2001/XMLSchema"
 xmlns:zoo="http://www.zoo.com"
 targetNamespace="http://www.zoo.com"
 elementFormDefault="qualified">

<xs:element name="workers" type="zoo:Tworkers"/>

<xs:complexType name="Tworkers">
<xs:sequence  maxOccurs="unbounded">
    <xs:element name="impiegato" type ="zoo:Timpiegato" minOccurs="0" />
    <xs:element name="manager" type ="zoo:Tmanager" minOccurs="0"/>
</xs:sequence>
</xs:complexType>

<xs:complexType name="Timpiegato">
<xs:sequence>
    <xs:element name="username" type ="xs:string"/>
    <xs:element name="password" type ="xs:string"/>
    <xs:element name="nome" type ="xs:string"/>
    <xs:element name="sesso" type ="xs:string"/>
    <xs:element name="eta" type ="xs:integer"/>
</xs:sequence>
</xs:complexType>

<xs:complexType name="Tmanager">
  <xs:sequence>
    <xs:element name="username" type ="xs:string"/>
    <xs:element name="password" type ="xs:string"/>
    <xs:element name="nome" type ="xs:string"/>
    <xs:element name="sesso" type ="xs:string"/>
    <xs:element name="eta" type ="xs:integer"/>
  </xs:sequence>
</xs:complexType>

</xs:schema>

当我使用 XML::LibXML::Schema 验证 xml 时,我得到:

../xml/workers.xml:0:架构有效性错误:元素“impiegato”:不需要此元素。预期是( {http://www.zoo.com}impiegato,{http://www.zoo.com}经理)。

Perl 代码:

my $parser = XML::LibXML->new;
my $doc = $parser->parse_file("../xml/workers.xml");
my $xmlschema = XML::LibXML::Schema->new( location => "../xml/worker.xsd" );
$xmlschema->validate($doc);

我认为是命名空间的问题,但不知道该怎么办。

附录:

我尝试从 XML 架构中删除 elementFormDefault="qualified" 属性。现在我有相反的错误:

../xml/workers.xml:0: Schemas validity error : Element '{http://www.zoo.com}impiegato':
This element is not expected. Expected is one of ( impiegato, manager ).

【问题讨论】:

    标签: xml perl xsd xml-libxml


    【解决方案1】:

    用 Saxon 验证这一点,它对我有用。我认为您运行验证的方式一定有错误。

    【讨论】:

    • 我将使用用于验证的代码编辑问题
    • 该文件对我来说似乎也有效。 Oxygen 和 SpringSource Tool Suite 上的验证器也没有抱怨。
    • 是的,我知道,如果我尝试使用 xmllint 验证它,它会验证
    • 添加了更多信息:“我试图从 XML 架构中删除 elementFormDefault="qualified" 属性。现在我遇到了相反的错误”
    • @qwertoyo 恐怕我帮不上什么忙。这似乎是一个与 Perl 相关的问题,而不是 XML 问题。我建议对您的问题进行编辑,以使其对 Perl 程序员更加可见。至于试图解决奇怪的行为。您是否尝试将命名空间前缀添加到顶部元素?
    【解决方案2】:

    解决了。问题出在 perl 代码中。出于某种原因,当您使用 XML:LibXML 将节点添加到 $doc 时,内存中的该节点不会获得默认命名空间。 解决了创建另一个 $doc2、解析 $doc->toString() 和验证 $doc2。

    我应该在我的问题中写下我正在添加一个节点,这是我的错。

    代码:

    my $doc2 = $parser->parse_string($root->toString());
    

    【讨论】:

      【解决方案3】:
      use strict;
      use warnings;
      
      use XML::LibXML;
      
      my $xml_file = 'test.xml';
      my $xsd_file = 'test.xsd';
      my $schema   = XML::LibXML::Schema->new(location => 
      $xsd_file);
      my $parser   = XML::LibXML->new;
      
      my $tree = $parser->parse_file($xml_file);
      
      # Valdate the XML file.
      eval { $schema->validate($tree) }; 
      if ( $@ ) { 
      warn "xmlfile failed validation\n$@" if $@;
      } 
      else { 
       print "Valide XML\n"; 
       }
      

      【讨论】:

      猜你喜欢
      • 2013-12-13
      • 1970-01-01
      • 1970-01-01
      • 2017-10-24
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多