XmlAttribute用于无界原始类型

时间:2014-01-13 23:59:54

标签: python spyne

我没有找到一种方法来描述可重复基元类型的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 = ???

1 个答案:

答案 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]
... )

此外,虽然我不在“测试是文档的一部分”阵营中,但我认为将相关测试的链接放在一起是合适的,因为这与您的用例直接相关。

https://github.com/arskom/spyne/blob/1d5ecf26da1d29b68d92451ebf33e5db3f8833dc/spyne/test/protocol/test_xml.py#L141

最后一位:自{2.1}起,{I}将被弃用。 2.x系列不会删除它,但它会在3.x中消失。 XmlData将替换它,这更容易实现和更快。详细信息将在2.11文档中。