7

环境:

  • Python v2.6.2
  • 肥皂水 v0.3.7

我使用的 WSDL(服务器)具有以下架构子部分(我尝试使用纯文本清楚地编写它) -


[小节#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' 是 'itinerary' 的数组,我不知道如何使用 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

3 回答 3

6

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

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

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

它是这样工作的,因为生成的 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 所期望的那样。

于 2011-01-20T21:55:53.433 回答
4

我相信您正在寻找的是:

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

只需要自己做这个;)帮助我发现它正在打印到控制台。那可能会给您以下内容:

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

干杯,雅克

于 2009-07-16T18:21:35.227 回答
3

对于这种类型的结构,我在数组对象上设置了一个名为“item”的属性,然后将列表成员附加到它上面。就像是:

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

即使对于具有多个级别的复杂调用,它也可以很好地解析和传递。

于 2010-01-23T13:45:41.070 回答