lxml如何在同时加载内联模式的同时针对XSD文件验证一些XML?

2024-09-25 16:25:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我无法让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:元素'amazonendevelope':没有可用于验证根的匹配全局声明。”

如果使用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"/>

我可以说,遵循include to amzn-base.xsd并不会最终得到AmazonEnvelope标记的定义。所以我的问题是:lxml是否可以通过像<AmazonEnvelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="amzn-envelope.xsd">这样的标记加载模式。如果没有,我如何验证我的图像源?


Tags: 文件httpwww模式xmllxmlxmlschemaetree
1条回答
网友
1楼 · 发布于 2024-09-25 16:25:08

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

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

一般来说,lxml不会读取xsi:noNamespaceSchemaLocation=“amzn envelope.xsd”这样的声明,但是如果您可以找到要验证的父架构,那么这应该包括您感兴趣的特定架构。

相关问题 更多 >