2009-07-15 121 views
6

环境:如何在Python中使用suds创建WSDL的数组类型?

  • 的Python V2.6.2
  • 泡沫v0.3.7

的WSDL(服务器)和我一起工作,有以下模式小节(我试着写它清楚地使用纯文本) -


[子本身ction#1]

searchRequest: (searchRequest){ 
    userIdentification = (userIdentification){ 
     username = "" 
     password = "" 
     } 
    itineraryArr = (itineraryArray){ 
     _arrayType = "" 
     _offset = "" 
     _id = "" 
     _href = "" 
     _arrayType = "" 
     } 
    ... 
    ... 

[分节#2]

itinerary: (itinerary){ 
    departurePoint = (locationPoint){ 
     locationId = None 
     radius = None 
     } 
    arrivalPoint = (locationPoint){ 
     locationId = None 
     radius = None 
     } 
    ... 
    ... 

没有与 'userIdentification' 没问题(这是一个“简单“型)

但是,'itineraryArr'是一个'行程'的数组,我不知道如何使用python来创建XML数组。

我试过几个组合,例如

itinerary0 = self.client.factory.create('itinerary') 
itineraryArray = self.client.factory.create('itineraryArray') 
itineraryArray = [itinerary0] 
searchRequest.itineraryArr = itineraryArray 

但我所有的试验结果与同一服务器错误 -

Server raised fault: 'Cannot use object of type itinerary as array' 
    (Fault){ 
     faultcode = "SOAP-ENV:Server" 
     faultstring = "Cannot use object of type itinerary as array" 
    } 

回答

4

我相信你正在寻找的是:

itinerary0 = self.client.factory.create('itinerary') 
itineraryArray = self.client.factory.create('itineraryArray') 
print itineraryArray 
itineraryArray.itinerary.append(itinerary0) 

只需要自己做这件事;)什么帮助我发现它正在打印到控制台。这将可能已经给你以下几点:

(itineraryArray){ 
    itinerary[] = <empty> 
} 

干杯,雅克

2

对于这种类型的结构我设置数组对象上调用“项目”的属性,然后将列表成员追加到它。类似于:

itineraryArray = self.client.factory.create('itineraryArray') 
itineraryArray.item = [itinerary0] 

即使对于具有多个级别的复杂调用,也能正常解析和传递。

6

我与RPC /编码样式WS和包含肥皂数组的方法在同一个案例中。打印请求(其中request = client.factory.create('Request'))给出:

(Request){ 
    requestid = None 
    option = 
    (ArrayOfOption){ 
    _arrayType = "" 
    _offset = "" 
    _id = "" 
    _href = "" 
    _arrayType = "" 
    } 
} 

()1request.option.append(选项1 1)由Jacques给出的溶液不起作用,因为它与一个错误消息ArrayOfOption instance has no attribute append结束。

通过mcauth给出的解决方案是这样的:

array = client.factory.create('ArrayOfOption') 
array.item = [option1, option2, option3, option4, option5, option6] 
request.option=array 

它可以如此如此,所得到的SOAP消息没有显示出arrayType属性:

<option xsi:type="ns3:ArrayOfOption"> 

我发现最好的解决方案也是最简单:

request.option = [option1, option2, option3, option4, option5, option6] 

它以一个很好的SOAP消息结束:

<option xsi:type="ns0:ArrayOfOption" ns3:arrayType="ns0:Option[6]"> 

正如服务器端WS预期的那样。

相关问题