python xml xsd lxml

python - ¿Cómo puede lxml validar algunos XML contra un archivo XSD mientras también carga un esquema en línea?



(1)

Tengo problemas para conseguir que lxml valide correctamente algunos xml. El esquema XSD y el archivo XML son ambos de la documentación de Amazon, por lo que deberían ser compatibles. Pero el XML en sí se refiere a otro esquema que no se está cargando.

Aquí está mi código, que se basa en el tutorial de validación lxml :

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: Elemento ''AmazonEnvelope'': No hay declaración global coincidente disponible para la raíz de validación".

No obtengo ningún error si valido contra amzn-envelope.xsd en lugar de ProductImage.xsd, pero eso frustra el punto de vista de si un feed de imagen determinado es válido. Todos los archivos xsd y xml mencionados están en mi directorio de trabajo junto con mi script python por cierto.

Aquí hay un fragmento de la muestra xml, que definitivamente debe ser válida:

<?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>

Aquí hay un fragmento del esquema (este archivo no es público, así que no puedo mostrarlo todo):

<?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"/>

Puedo decir que seguir la inclusión de amzn-base.xsd no termina llegando a una definición de la etiqueta AmazonEnvelope . Así que mi pregunta es: ¿puede lxml cargar esquemas a través de una etiqueta como <AmazonEnvelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="amzn-envelope.xsd"> . Y si no, ¿cómo puedo validar mi feed de imágenes?


La respuesta es que debo validar mediante el archivo de esquema principal, que como se menciona en la parte superior del archivo XML es amzn-envelope.xsd ya que contiene la línea:

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

En general, entonces, lxml no leerá una declaración como xsi: noNamespaceSchemaLocation = "amzn-envelope.xsd", pero si puede encontrar el esquema primario para validar, entonces debería incluir el esquema específico que le interese.