Python, generateDS, атрибуты ref из схемы не генерируются должным образом - PullRequest
0 голосов
/ 11 апреля 2020

Используя generateDS, я генерирую Python код из схемы - код, который (обычно) позволяет легко создавать корректные и действительные XML. До сих пор работал довольно хорошо. Однако я застреваю, когда использую атрибуты стиля ref в своей схеме. generateDS, похоже, теряет отслеживание внешней схемы, из которой создается атрибут, и не позволяет сгенерировать соответствующий префикс пространства имен для атрибута.

простой пример схемы: (нарушитель спокойствия - это xs: attribute ref = "xlink: href "')

[sample.xsd]

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sample="http://www.sample.com/sample/" targetNamespace="http://www.sample.com/sample/">
    <xs:import namespace="http://www.w3.org/1999/xlink" schemaLocation="http://www.loc.gov/standards/xlink/xlink.xsd"/>
    <xs:element name="myelement">
        <xs:complexType>
            <xs:attribute ref="xlink:href"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

Затем я генерирую соответствующие классы sample.py, используя:

generateDS -o sample.py sample.xsd 

Следующие основы c Python пример кода использует сгенерированные классы для создания образца. xml:

[test.py]

import sample

me = sample.myelement()
me.set_href("http://www.google.com")

with open("sample.xml", "wt") as outfile:
    me.export(outfile=outfile, level=0, pretty_print=True,
              namespacedef_='xmlns:sample="http://www.sample.com/sample/" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sample.com/sample/ sample.xsd http://www.w3.org/1999/xlink http://www.w3.org/1999/xlink/xlink.xsd"', 
              namespaceprefix_='sample:')

[sample.xml]

<?xml version="1.0"?>
<sample:myelement
    xmlns:sample="http://www.sample.com/sample/"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.sample.com/sample/ sample.xsd http://www.w3.org/1999/xlink http://www.w3.org/1999/xlink/xlink.xsd"
    href="http://www.google.com"
/>

, который не проверяется по схеме sample.xsd, поскольку атрибут href = "http://www.google.com" не находится в правильном пространстве имен (должно быть: xlink: href = "http://www.google.com", который проверяется правильно):

[вывод с использованием xmlllint (аналогичные другие пытались с тем же результатом)]

sample.xml:1: element myelement: Schemas validity error : 
Element '{http://www.sample.com/sample/}myelement', attribute 'href': 
The attribute 'href' is not allowed.
sample.xml fails to validate

я пропустил что-нибудь очевидное в использовании generateDS, схеме, использовании пространств имен, использовании сгенерированных код класса?

любые комментарии приветствуются

веселит. Джоэл

...