Используя 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, схеме, использовании пространств имен, использовании сгенерированных код класса?
любые комментарии приветствуются
веселит. Джоэл