我没有找到一种方法来描述可重复基元类型的xml属性;到目前为止我最好的猜测:
class Contact(ComplexModel):
"contact person and communication channel"
contactName = primitive.Unicode(min_len=1, max_len=70, nillable=False)
channel = primitive.Unicode(max_occurs='unbounded')
channelCode = XmlAttribute(Enum('TELEPHONE', 'TELEFAX', 'EMAIL', 'WEBSITE', type_name='channelCode'), attribute_of='channel')
这会产生一个看起来正确的wsdl(至少对我而言):
<xs:complexType name="Contact">
<xs:sequence>
<xs:element name="channel" minOccurs="0" maxOccurs="unbounded" nillable="true">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="channelCode" type="tns:channelCode"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="contactName" type="tns:Contact_contactNameType" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
但我不知道如何使用Contact类!
>>> c = Contact()
>>> c.contactName = 'xxx'
>>> c.channel = [ '1', '2' ]
>>> # c.channelCode = ???
答案 0 :(得分:1)
你几乎就在那里:)你只需要将channelCode的类型声明放到一个单独的变量中。
ChannelCodeType = Enum('TELEPHONE', 'TELEFAX', 'EMAIL', 'WEBSITE',
type_name='channelCode')
class Contact(ComplexModel):
"contact person and communication channel"
contactName = primitive.Unicode(min_len=1, max_len=70, nillable=False)
channel = primitive.Unicode(max_occurs='unbounded')
channelCode = XmlAttribute(ChannelCodeType, attribute_of='channel')
现在你可以做适当的任务:
>>> c = Contact()
>>> c.contactName = 'xxx'
>>> c.channel = [ '1', '2' ]
>>> c.channelCode = [ChannelCodeType.TELEPHONE, ChannelCodeType.FAX]
或者只是:
>>> Contact(
... contactName='xxx',
... channel=[ '1', '2' ],
... channelCode=[ChannelCodeType.TELEPHONE, ChannelCodeType.FAX]
... )
此外,虽然我不在“测试是文档的一部分”阵营中,但我认为将相关测试的链接放在一起是合适的,因为这与您的用例直接相关。
最后一位:自{2.1}起,{I}将被弃用。 2.x系列不会删除它,但它会在3.x中消失。 XmlData将替换它,这更容易实现和更快。详细信息将在2.11文档中。