Python: изучить XSD XML-схему - PullRequest
2 голосов
/ 27 апреля 2010

Я хотел бы изучить схему XSD на python. В настоящее время я использую lxml, который очень хорошо выполняет свою работу, когда ему нужно только проверить документ на соответствие схеме. Но я хочу знать, что находится внутри схемы, и получить доступ к элементам в поведении lxml.

Схема:

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:include schemaLocation="worker_remote_base.xsd"/>
    <xsd:include schemaLocation="transactions_worker_responses.xsd"/>
    <xsd:include schemaLocation="transactions_worker_requests.xsd"/>
</xsd:schema>

Код lxml для загрузки схемы (просто):

xsd_file_handle = open( self._xsd_file, 'rb')
xsd_text        = xsd_file_handle.read()
schema_document   = etree.fromstring(xsd_text, base_url=xmlpath)
xmlschema         = etree.XMLSchema(schema_document)

Затем я могу использовать schema_document (то есть etree._Element), чтобы пройти схему в виде XML-документа. Но поскольку etree.fromstring (по крайней мере, так кажется) ожидает XML-документ, элементы xsd:include не обрабатываются.

В настоящее время проблема решается путем анализа первого документа схемы, затем загрузки включаемых элементов, а затем вставки их один за другим в основной документ вручную:

BASE_URL            = "/xml/"
schema_document     = etree.fromstring(xsd_text, base_url=BASE_URL)
tree                = schema_document.getroottree()

schemas             = []
for schemaChild in schema_document.iterchildren():
    if schemaChild.tag.endswith("include"):
        try:
            h = open (os.path.join(BASE_URL, schemaChild.get("schemaLocation")), "r")
            s = etree.fromstring(h.read(), base_url=BASE_URL)
            schemas.append(s)
        except Exception as ex:
            print "failed to load schema: %s" % ex
        finally:
            h.close()
        # remove the <xsd:include ...> element
        self._schema_document.remove(schemaChild)

for s in schemas:
# inside <schema>
    for sChild in s:
        schema_document.append(sChild)

То, что я прошу, это идея, как решить проблему, используя более распространенный способ. Я уже искал другие синтаксические анализаторы в python, но пока не было ничего подходящего в этом случае.

Привет,

1 Ответ

0 голосов
/ 05 сентября 2011

PyXB может обрабатывать xsd: include. Я использовал PyXB для огромных файлов схемы продуктов Amazon.com, где включенный файл включает дополнительные файлы xsd на нескольких уровнях Настоятельно рекомендуется.

...