【问题标题】:How to create arrayType for WSDL in Python (using suds)?如何在 Python 中为 WSDL 创建 arrayType(使用 suds)?
【发布时间】:2010-11-10 23:26:25
【问题描述】:

环境:

  • Python v2.6.2
  • suds 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"
     }

【问题讨论】:

    标签: python xml arrays wsdl suds


    【解决方案1】:

    我的情况相同,使用 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 所期望的那样。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        我相信您正在寻找的是:

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

        我必须自己做这件事;)帮助我发现它正在打印到控制台。那可能会给您以下信息:

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

        干杯,雅克

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-09-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多