2011-12-08 7 views
2

lxmlでxmlの検証に問題が発生しました。 XSDスキーマとXMLファイルはどちらもAmazonのドキュメントにあるため、互換性があります。しかし、XML自体は、ロードされていない別のスキーマを指しています。ここで lxmlは、インラインスキーマもロードしている間に、XSDファイルに対していくつかのXMLを検証する方法を教えてください。

lxml validation tutorialに基づいており、私のコードです:

xsd_doc = etree.parse('ProductImage.xsd') 
xsd = etree.XMLSchema(xsd_doc) 
xml = etree.parse('ProductImage_sample.xml') 
xsd.validate(xml) 
print xsd.error_log 

「ProductImage_sample.xml:2:0:ERROR:SCHEMASV:SCHEMAV_CVC_ELT_1:要素 'AmazonEnvelope' のために利用可能なマッチンググローバル宣言検証ルート。

ProductImage.xsdの代わりにamzn-envelope.xsdを検証するとエラーは表示されませんが、指定されたImageフィードが有効かどうかはわかりません。すべてのxsd & xmlファイルは私のpythonスクリプトと一緒に作業ディレクトリにあります。ここで

は間違いなく有効である必要がありサンプルXMLの抜粋である:ここで

<?xml version="1.0"?> 
<AmazonEnvelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="amzn-envelope.xsd"> 
    <Header> 
     <DocumentVersion>1.01</DocumentVersion> 
     <MerchantIdentifier>Q_M_STORE_123</MerchantIdentifier> 
    </Header> 
    <MessageType>ProductImage</MessageType> 
    <Message> 
     <MessageID>1</MessageID> 
     <OperationType>Update</OperationType> 
     <ProductImage> 
      <SKU>1234</SKU> 

は、スキーマの抜粋である(このファイルはパブリックではありませんので、私はそれのすべてを表示することはできません)。

<?xml version="1.0"?> 
<!-- Revision="$Revision: #5 $" --> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xsd:include schemaLocation="amzn-base.xsd"/> 
    <xsd:element name="ProductImage"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element ref="SKU"/> 

私がすることが含まAMZN-base.xsdを以下はAmazonEnvelopeタグの定義に達するまで終わらないと言うことができます。だから私の質問は:lxml <AmazonEnvelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="amzn-envelope.xsd">のようなタグを介してスキーマを読み込むことができます。それ以外の場合は、どうすればイメージフィードを検証できますか? 、その後、一般的には

<xsd:include schemaLocation="ProductImage.xsd"/> 

lxmlの:

+1

lxml doesn 'スキーマの位置を扱うxsi属性を扱う。私が関連付けることができないのは、サンプルXMLのどのノードがXSDのProductImage要素定義と一致するかです。言い換えれば、サンプルXMLのどこかにというタグが付いていますか? –

+0

はい、見ることができ、インデントが意味するように、タグがあります。このタグは、SKUで始まるいくつかのサブ要素を含むと終了します。 –

+0

SchemaLocation = "amzn-envelope.xsd"は、実際には、ProductImage.xsdを含むすべてのサブスキーマにインクルードされていることがわかったので、そのファイルで検証するためのヒントです。 –

答えて

2

答えは、これは行が含まれているとして、私は、親スキーマれるXMLファイルの先頭に述べたように、ファイル、AMZN-envelope.xsdによって検証する必要がありますですxsi:noNamespaceSchemaLocation = "amzn-envelope.xsd"のような宣言は読めませんが、それに対して検証する親スキーマを見つけることができれば、興味のあるスキーマが含まれているはずです。

関連する問題