lxml如何针对XSD文件验证某些XML,同时还加载内联架构?

时间:2011-12-08 00:02:02

标签: python xml xsd lxml

我在获取lxml以成功验证某些xml时遇到问题。 XSD架构和XML文件都来自Amazon文档,因此应该兼容。但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:错误:SCHEMASV:SCHEMAV_CVC_ELT_1:元素'AmazonEnvelope':没有可用于验证根目录的匹配全局声明。”

如果我对amzn-envelope.xsd而不是ProductImage.xsd进行验证,那么我没有错误,但是如果给定的图像提要是有效的,则会失败。所有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的include之后,最终没有达到AmazonEnvelope标签的定义。所以我的问题是:可以通过像<AmazonEnvelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="amzn-envelope.xsd">这样的标签加载lxml。如果没有,我该如何验证我的图像Feed?

1 个答案:

答案 0 :(得分:2)

答案是我应该通过父模式文件进行验证,XML文件顶部提到的是amzn-envelope.xsd,因为它包含以下行:

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

一般情况下,lxml不会读取xsi这样的声明:noNamespaceSchemaLocation =&#34; amzn-envelope.xsd&#34;但如果你能找到要验证的父模式,那么这应该包含你感兴趣的特定模式。