0

反復可能なプリミティブ型の 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 = ???
4

1 に答える 1

2

もう少しです :) 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

最後のビット: attribute_of2.11 で非推奨になります。2.x シリーズでは削除されませんが、3.x では削除されます。XmlData はそれを置き換えます。これは、実装が簡単で高速です。詳細は 2.11 のドキュメントに記載されています。

于 2014-01-14T20:13:10.857 に答える