2014-01-13 33 views
0

我還沒有找到一種方法來描述可重複基元類型的xml屬性;到目前爲止我最好的猜測:無界基元類型的XmlAttribute

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

你幾乎在那裏:)你只需要將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_of將被棄用的2.11。它不會被刪除的2.x系列,但它會消失3.x. XmlData將取代它,這是更容易實現和更快。詳情將在2.11文檔中。

+0

它的工作原理,謝謝! – dvd