Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python lxml如何在加载内联模式的同时,针对XSD文件验证一些XML?_Python_Xml_Xsd_Lxml - Fatal编程技术网

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

Python lxml如何在加载内联模式的同时,针对XSD文件验证一些XML?,python,xml,xsd,lxml,Python,Xml,Xsd,Lxml,我在让lxml成功验证某些xml时遇到问题。XSD模式和XML文件都来自Amazon文档,因此应该兼容。但是XML本身引用了另一个未加载的模式 这是我的代码,它基于: ProductImage_sample.xml:2:0:错误:SCHEMASV:SCHEMAV_CVC_ELT_1:元素'amazonedevelope':验证根目录没有匹配的全局声明可用 如果使用amzn-envelope.xsd而不是ProductImage.xsd进行验证,则不会出现任何错误,但这样做会破坏查看给定图像提要是

我在让lxml成功验证某些xml时遇到问题。XSD模式和XML文件都来自Amazon文档,因此应该兼容。但是XML本身引用了另一个未加载的模式

这是我的代码,它基于:

ProductImage_sample.xml:2:0:错误:SCHEMASV:SCHEMAV_CVC_ELT_1:元素'amazonedevelope':验证根目录没有匹配的全局声明可用

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

1.01
Q_M_商店_123
产品形象
1.
更新
1234
下面是模式的一个片段(此文件不是公共文件,因此无法显示所有内容):



我可以说,遵循include to amzn-base.xsd并没有最终得到
amazonedevelope
标记的定义。所以我的问题是:lxml能否通过像
这样的标记加载模式。如果没有,我如何验证我的图像提要?

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

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


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

lxml不会处理处理处理模式位置的xsi属性。我似乎无法关联的是,样本XML中的哪个节点与XSD中的ProductImage元素定义相匹配;换句话说,您是否在示例XML中的某个位置获得了标记?是的,正如您所看到的和缩进所暗示的,在包含以SKU开头的一些子元素后,该标记将关闭。事实证明,SchemaLocation=“amzn envelope.xsd”实际上是一个提示,提示我通过该文件进行验证,我发现它确实包含了所有子模式的include,包括ProductImage.xsd。它一定是盲的;由于模式位置不起作用,如果您只想验证ProductImage节点,那么我将从ProductImage节点创建一个ElementTree(使用XPath访问它)并验证它;它应该可以工作,根据,酷,没有意识到你可以验证文件的一部分。
<?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"/>
<xsd:include schemaLocation="ProductImage.xsd"/>