2010-06-12 23 views
3

Je me connecte avec un client SUDS à un serveur SOAP dont wsdl contient plusieurs énumérations comme les suivantes:Liste toutes les valeurs possibles pour l'énumération SOAP avec Python SUDS

</simpleType> 
    <simpleType name="FOOENUMERATION"> 
    <restriction base="xsd:string"> 
    <enumeration value="ALPHA"><!-- enum const = 0 --> 
    <enumeration value="BETA"/><!-- enum const = 1 --> 
    <enumeration value="GAMMA"/><!-- enum const = 2 --> 
    <enumeration value="DELTA"/><!-- enum const = 3 --> 
    </restriction> 
</simpleType> 

Dans mon client je reçois des séquences qui contiennent éléments de ces différents types d'énumération. Mon besoin est que donné une variable membre, j'ai besoin de connaître toutes les valeurs d'énumération possibles. Fondamentalement, j'ai besoin d'une fonction qui prend une instance de l'une de ces énumérations et renvoie une liste de chaînes qui sont toutes les valeurs possibles.

Quand j'ai une instance, cours d'exécution:

print type(foo.enumInstance) 

-je obtenir:

<class 'suds.sax.text.Text'> 

Je ne sais pas comment obtenir le nom de simpleType réelle de cela, puis obtenir les valeurs possibles à partir de ce court d'analyser le WSDL moi-même.

Edit: Je ai découvert un moyen d'obtenir les énumérations donné le nom simpleType, comme ci-dessous, donc mon problème se réduit à findingthe nom de type pour une variable donnée, étant donné que le type (x) retourne suds.sax .text.Text au lieu du vrai nom

for l in client.factory.create('FOOENUMERATION'): 
    print l[0] 

Répondre

1

J'ai trouvé un moyen plutôt astucieux de s'en sortir, mais j'espère que quelqu'un a encore une meilleure réponse pour moi. Pour certains objets raison renvoyé par le serveur ont énumérations avec le suds.sax.text de type .Text, mais ceux créés avec l'usine ont des types liés à l'ENUM, donc cela fonctionne:

def printEnums(obj,field): 
    a=client.factory.create(str(getattr(client.factory.create(str(obj.__class__).replace('suds.sudsobject.','')),field).__class__).replace('suds.sudsobject.','')) 
    for i in a: 
     print i[0] 

alors je peux faire:

printEnums(foo,'enumInstance') 

et même si foo a été retourné à partir du serveur et non créé par une usine obtenir une liste des valeurs possibles pour foo.enumInstance, puisque je crée en usine une nouvelle classe du même type que celui qui a été transmis. ne peut pas imaginer que ce gâchis est la bonne/meilleure façon de le faire.

0

Voyez si vous pouvez nourrir dans le WSDL dans le composant ElementTree sur Python et l'utiliser pour obtenir les énumérations.

3

Si vous connaissez le nom de l'énumération que vous voulez, vous devriez pouvoir traiter l'objet d'énumération que vous donne comme un dictionnaire, et faire une recherche directe avec ce nom. Par exemple, si votre type d'énumération est appelée SOAPIPMode et que vous voulez le nom ENUM STATIC_MANUAL dans cette énumération:

soapIPMode = client.factory.create('SOAPIPMode') 
staticManual = soapIPMode['STATIC_MANUAL'] 

La valeur résultante est de type suds.sax.text.Text qui agit comme une chaîne.

Vous pouvez également itérer sur le type d'énumération comme si elle était un tableau:

for i in range(len(soapIPMode): 
    process(soapIPMode[i])