2009-07-15 4 views
6

Environnement:Comment créer un arrayType pour WSDL en Python (en utilisant du mousse)?

  • Python v2.6.2
  • suds v0.3.7

Le WSDL (serveur) Je travaille avec, ont les sous-sections de schéma suivant (j'ai essayé d'écrire en utilisant clairement le texte brut) -


[sous-se ction # 1]

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

[sous-section 2]

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

Il n'y a aucun problème avec 'userIdentification' (qui est un " simple "type)

Mais, 'itinéraireArr' est un tableau de 'itinéraire', et je ne sais pas comment utiliser python pour créer un tableau XML.

J'ai essayé quelques combinaisons, par exemple

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

Mais tous mes essais ont donné la même erreur de serveur -

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

Répondre

4

Je crois que ce que vous cherchez est:

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

Je devais le faire moi-même;) Qu'est-ce qui m'a aidé à trouver l'impression sur la console? Cela aurait probablement donné vous les éléments suivants:

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

Cheers, Jacques

2

Pour ce type de structure I définir un attribut appelé « point » sur l'objet de tableau et puis ajoutez le membre de la liste à elle. Quelque chose comme:

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

Qui analyse et passe in fine, même pour des appels complexes avec plusieurs niveaux.

6

Je suis dans le même cas, avec un style RPC/codé WS et une méthode qui contient un tableau de savon. une demande d'impression (où request = client.factory.create('Request')) donne:

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

La solution donnée par Jacques (1request.option.append (option1) 1) ne fonctionne pas, car il se termine par un message d'erreur ArrayOfOption instance has no attribute append.

La solution donnée par mcauth ressemble à ceci:

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

Il fonctionne si oui, que le message SOAP résultant ne montre aucun arrayType attribut:

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

La meilleure solution que je trouve aussi la plus simple:

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

Il se termine par un bon message SOAP:

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

comme attendu par le côté serveur WS.

Questions connexes