我有一个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并导入绑定lib之前,我已经完成了几次。
现在我尝试使用新版本的xsd文件。新的xsd在apiobject中有两种类型的对象,请求和响应。 TableType1类型的定义与响应和请求不同。但是在绑定lib中,我无法访问请求和响应的内部类型。
我想要做的是为apiobject生成一个xml字符串,其响应包含TableType1。但是因为我无法访问TableType1对象,所以我既不能填充它也不能将它放到apiobject的响应中。
如何使用TableType1创建有效的apiobject响应?
PS:某些xml编辑器说xsd有效。但pyxb无法使用xsd方案导入样本xml文件...
答案 0 :(得分:0)
我对问题的评论中提供的link确实提供了问题的解决方案。
如果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应该澄清......