2009-03-18 7 views
2

私は、ファイルをスキーマに対してロードして検証しようとしているPerlスクリプトのサンプルを用意しています。Perl、LibXML and Schemas

#!/usr/bin/env perl 
use strict; 
use warnings; 
use XML::LibXML; 

my $filename = 'source.xml'; 
my $xml_schema = XML::LibXML::Schema->new(location=>'library.xsd'); 
my $parser = XML::LibXML->new(); 
my $doc = $parser->parse_file ($filename); 

eval { 
    $xml_schema->validate ($doc); 
}; 

if ([email protected]) { 
    print "File failed validation: [email protected]" if [email protected]; 
} 

eval { 
    print "Here\n"; 
    foreach my $book ($doc->findnodes('/library/book')) { 
     my $title = $book->findnodes('./title'); 
     print $title->to_literal(), "\n"; 

    } 
}; 

if ([email protected]) { 
    print "Problem parsing data : [email protected]\n"; 
} 

残念ながら、XMLファイルを妥当性検査していますが、$ブックアイテムが見つからないため、何も印刷されません。

XMLファイルからスキーマを削除し、PLファイルから検証を削除した場合、正常に動作します。

私はデフォルトの名前空間を使用しています。デフォルトの名前空間(xmlns:lib = "http://libs.domain.com")を使用せず、XMLファイルのすべての項目にlibをプレフィックスとして付け、XPath式を変更して名前空間接頭辞(/ lib:ライブラリ/ libに:本は)それは再度ファイルを作品

なぜ、私が何をしないのです

XML:。??

<?xml version="1.0" encoding="utf-8"?> 
<library xmlns="http://lib.domain.com" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://lib.domain.com .\library.xsd"> 
    <book> 
     <title>Perl Best Practices</title> 
     <author>Damian Conway</author> 
     <isbn>0596001738</isbn> 
     <pages>542</pages> 
     <image src="http://www.oreilly.com/catalog/covers/perlbp.s.gif" width="145" height="190"/> 
    </book> 
    <book> 
     <title>Perl Cookbook, Second Edition</title> 
     <author>Tom Christiansen</author> 
     <author>Nathan Torkington</author> 
     <isbn>0596003137</isbn> 
     <pages>964</pages> 
     <image src="http://www.oreilly.com/catalog/covers/perlckbk2.s.gif" width="145" height="190"/> 
    </book> 
    <book> 
     <title>Guitar for Dummies</title> 
     <author>Mark Phillips</author> 
     <author>John Chappell</author> 
     <isbn>076455106X</isbn> 
     <pages>392</pages> 
     <image src="http://media.wiley.com/product_data/coverImage/6X/07645510/076455106X.jpg" width="100" height="125"/> 
    </book> 
</library> 

XSD:XML::LibXML docsから

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns="http://lib.domain.com" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://lib.domain.com"> 
    <xs:attributeGroup name="imagegroup"> 
     <xs:attribute name="src" type="xs:string"/> 
     <xs:attribute name="width" type="xs:integer"/> 
     <xs:attribute name="height" type="xs:integer"/> 
    </xs:attributeGroup> 
    <xs:element name="library"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element maxOccurs="unbounded" name="book"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="title" type="xs:string"/> 
          <xs:element maxOccurs="unbounded" name="author" type="xs:string"/> 
          <xs:element name="isbn" type="xs:string"/> 
          <xs:element name="pages" type="xs:integer"/> 
          <xs:element name="image"> 
           <xs:complexType> 
            <xs:attributeGroup ref="imagegroup"/> 
           </xs:complexType> 
          </xs:element> 
         </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

答えて

3

のXPathに関する一般的な間違いは にあるデフォルトの名前空間でない前方一致 要素との要素名からなる、ノードテストを想定。 この仮定は間違っています.XXath 仕様では、このようなノードテストは (すなわちnull)名前空間にある要素にのみ一致します。 推奨方法は、XPathの観点から、だから、XML::LibXML::XPathContext モジュール

を使用 することです...(以降 )... ...、何の「デフォルト」の名前空間は?ありませんnull以外の名前空間の場合は、XPathで指定する必要があります。 XML :: LibXML :: XPathContextモジュールでは、XPath式で使用する名前空間のプレフィックスを作成できます。

関連する問題