python pyxb: создание XML со сложным встроенным типом
У меня есть файл xsd и мне нужно создать XML соответственно.
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.1" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:simpleType name="edateTimeType">
<xs:restriction base="xs:dateTime">
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="eEurocents">
<xs:restriction base="xs:int">
<xs:maxExclusive value="1000000"/>
<xs:minExclusive value="-1000000"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="unixTimestampType">
<xs:restriction base="xs:nonNegativeInteger">
<xs:minInclusive value="1262304000"/>
<!-- after 1.1.2010-->
</xs:restriction>
</xs:simpleType>
<xs:complexType name="timeRangeType">
<xs:sequence>
<xs:element name="start" type="edateTimeType" minOccurs="1" maxOccurs="1"/>
<xs:element name="stop" type="edateTimeType" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
<xs:element name="apiobject">
<xs:complexType>
<xs:sequence>
<xs:element name="header" minOccurs="1" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="A" type="eEurocents" minOccurs="1" maxOccurs="1"/>
<xs:element name="B" type="eEurocents" minOccurs="0" maxOccurs="1"/>
<xs:element name="unixTimestamp" type="unixTimestampType" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:choice maxOccurs="1">
<xs:element name="response" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="TableType1" minOccurs="0" maxOccurs="5">
<xs:complexType>
<xs:sequence>
<xs:element name="teid" type="unixTimestampType"/>
<xs:element name="entry" type="eEurocents" maxOccurs="192"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="request" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="TableType1" minOccurs="0" maxOccurs="5">
<xs:complexType>
<xs:sequence>
<xs:element name="timestamp" type="unixTimestampType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Я сделал это несколько раз, прежде чем использовать python3 pyxb / pyxbgen и импортировать библиотеку привязок.
Теперь я попробовал то же самое с новой версией файла xsd. Новый xsd имеет в объекте два типа объектов: запросы и ответы. Тип TableType1 определяется по-разному для ответа и запросов. Но в связывающем lib внутренние типы запросов и ответов мне не доступны.
То, что я хотел бы сделать, это создать строку XML для apiobject с ответом, содержащим TableType1. Но так как я не могу получить доступ к объекту TableType1, я не могу ни заполнить его, ни поместить в ответ объекта apiobject.
Как я могу создать правильный ответ apiobject с TableType1?
PS: какой-то редактор XML говорит, что xsd действителен. Но pyxb не может импортировать образец XML-файла, используя схему xsd...
1 ответ
Ссылка, приведенная в моем комментарии к вопросам, действительно предлагает решение вопроса.
Если ваш файл, сгенерированный pyxb, просто называется связыванием, вы можете сгенерировать любой объект с помощью pyxb.BIND (...).
import binding
import pyxb
xml_object = binding.apiobject()
xml_object.header = pyxb.BIND()
# Now xml_object.header offers you the attributes you would expect from xsd file.
# You can create your objects from the binding and assign it to your object.
xml_object.header.A = binding.eEurocents(1234)
pyxb даже достаточно умен, чтобы выбрать правильный объект в иерархии. Так что это также будет работать для TableType1 и выбрать правильный объект в соответствии с требованиями.
xml_object.request = pyxb.BIND()
xml_object.request.TableType1 = pyxb.BIND()
Так как это находится в контексте запроса, вам нужно будет установить только временную метку. Чтобы добавить последовательность меток времени, вы должны получить соответствующий элемент вашей суперпоследовательности и добавить к нему. Звучит зашито, но пробуя пример с xsd, следует уточнить...