如何在Python中使用WSDL创建arrayType(使用suds)?

Uri*_*Uri 6 python xml arrays wsdl suds

环境:

  • Python v2.6.2
  • 泡沫v0.3.7

我使用的WSDL(服务器)有以下架构子部分(我试图用纯文本清楚地写出来) -


[第1节]

searchRequest: (searchRequest){
    userIdentification = (userIdentification){
        username = ""
        password = ""
        }
    itineraryArr = (itineraryArray){
        _arrayType = ""
        _offset = ""
        _id = ""
        _href = ""
        _arrayType = ""
        }
   ...
   ...
Run Code Online (Sandbox Code Playgroud)

[第2节]

itinerary: (itinerary){
    departurePoint = (locationPoint){
        locationId = None
        radius = None
        }
    arrivalPoint = (locationPoint){
        locationId = None
        radius = None
        }
   ...
   ...
Run Code Online (Sandbox Code Playgroud)

'userIdentification'没有问题(这是一种"简单"类型)

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

例如,我尝试了几种组合

itinerary0 = self.client.factory.create('itinerary')
itineraryArray = self.client.factory.create('itineraryArray')
itineraryArray = [itinerary0]
searchRequest.itineraryArr = itineraryArray
Run Code Online (Sandbox Code Playgroud)

但我的所有试验都导致同样的服务器错误 -

    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"
     }
Run Code Online (Sandbox Code Playgroud)

小智 6

我在相同的情况下,使用RPC /编码样式WS和包含soap数组的方法.打印请求(在哪里request = client.factory.create('Request'))给出:

(Request){
  requestid = None
  option = 
    (ArrayOfOption){
     _arrayType = ""
     _offset = ""
     _id = ""
     _href = ""
     _arrayType = ""
  }
 }
Run Code Online (Sandbox Code Playgroud)

Jacques(1request.option.append(option1)1)给出的解决方案不起作用,因为它以错误消息结束ArrayOfOption instance has no attribute append.

mcauth给出的解决方案如下所示:

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

它的工作原理如此,因为生成的SOAP消息不显示任何arrayType属性:

<option xsi:type="ns3:ArrayOfOption">
Run Code Online (Sandbox Code Playgroud)

我找到的最佳解决方案也是最简单的:

request.option = [option1,  option2,  option3,  option4,  option5,  option6]
Run Code Online (Sandbox Code Playgroud)

它以良好的SOAP消息结束:

<option xsi:type="ns0:ArrayOfOption" ns3:arrayType="ns0:Option[6]">
Run Code Online (Sandbox Code Playgroud)

正如服务器端WS所期望的那样.


小智 4

我相信您正在寻找的是:

itinerary0 = self.client.factory.create('itinerary')
itineraryArray = self.client.factory.create('itineraryArray')
print itineraryArray
itineraryArray.itinerary.append(itinerary0)
Run Code Online (Sandbox Code Playgroud)

只需要我自己做这件事;)帮助我找到它的是打印到控制台。那可能会给你以下结果:

 (itineraryArray){
   itinerary[] = <empty>
 }
Run Code Online (Sandbox Code Playgroud)

干杯,雅克