views:

757

answers:

2

Environment:

  • Python v2.6.2
  • suds v0.3.7

The WSDL (server) I work with, have the following schema sub-sections (I tried to write it clearly using plain text) -


[ sub-section #1 ]

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


[ sub-section #2 ]

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


There is no problem with 'userIdentification' (which is a "simple" type)

But, 'itineraryArr' is an array of 'itinerary', and I don't know how to use python to create XML array.

I tried few combinations, for example

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

But all my trials resulted with the same server error -

    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"
     }

Appreciate you help.....

Thanks, Uri

A: 

I believe what you are looking for is:

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

Just had to do this myself;) What helped me find it was printing to the console. That would have probably given you the following:

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

Cheers,Jacques

A: 

For this type of structure I set an attribute called 'item' on the array object and then append the list member to it. Something like:

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

Which parses and passes in fine, even for complex calls with multiple levels.

mcauth