我在获取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?
答案 0 :(得分:2)
答案是我应该通过父模式文件进行验证,XML文件顶部提到的是amzn-envelope.xsd,因为它包含以下行:
<xsd:include schemaLocation="ProductImage.xsd"/>
一般情况下,lxml不会读取xsi这样的声明:noNamespaceSchemaLocation =&#34; amzn-envelope.xsd&#34;但如果你能找到要验证的父模式,那么这应该包含你感兴趣的特定模式。