Как lxml может проверить некоторые XML-данные в обоих файлах XSD, одновременно загружая и встроенную схему? - PullRequest
2 голосов
/ 08 декабря 2011

У меня проблемы с получением lxml для успешной проверки некоторых xml. Схема XSD и файл XML взяты из документации Amazon, поэтому должны быть совместимы. Но сам XML относится к другой схеме, которая не загружается.

Вот мой код, основанный на учебнике 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: ОШИБКА: 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 не будет достигнуто определение тега AmazonEnvelope. Поэтому мои вопросы таковы: может ли lxml загрузить схемы с помощью тега типа <AmazonEnvelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="amzn-envelope.xsd">. И если нет, то как я могу проверить свой канал изображений?

1 Ответ

2 голосов
/ 08 декабря 2011

Ответ должен быть подтвержден с помощью родительского файла схемы, который, как упоминалось в верхней части XML-файла, называется amzn-envelope.xsd, так как содержит строку:

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

В общем случае, lxml не будет читать такое объявление как xsi: noNamespaceSchemaLocation = "amzn-envelope.xsd", но если вы можете найти родительскую схему для проверки, то это, мы надеемся, должно включать конкретную интересующую вас схему в.

...