使用Python SUDS列出SOAP枚举的所有可能值

时间:2010-06-12 03:02:41

标签: python soap enumeration suds

我正在将SUDS客户端连接到SOAP服务器,其wsdl包含许多枚举,如下所示:

</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>

在我的客户端,我收到的序列包含这些各种枚举类型的元素。我需要的是,给定一个成员变量,我需要知道所有可能的枚举值。基本上我需要一个函数,它接受这些枚举之一的实例并返回一个字符串列表,这些字符串都是可能的值。

当我有一个实例时,运行:

print type(foo.enumInstance)

我明白了:

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

我不确定如何从中获取实际的simpleType名称,然后从我自己解析WSDL的那篇文章中获取可能的值。

编辑:我发现了一种获取给定simpleType名称的枚举的方法,如下所示,所以我的问题缩小到找到给定变量的类型名称,给定类型(x)返回suds.sax.text.Text而不是真实姓名

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

3 个答案:

答案 0 :(得分:3)

如果您知道所需枚举的名称,您应该能够将枚举对象suds视为字典,并使用该名称进行直接查找。例如,如果您的枚举类型被称为SOAPIPMode,并且您希望在该枚举中使用名为STATIC_MANUAL的枚举:

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

结果值的类型为suds.sax.text.Text,其作用类似于字符串。

您也可以迭代枚举类型,就像它是一个数组一样:

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

答案 1 :(得分:1)

我已经想出了一个相当愚蠢的方法来解决这个问题,但希望有人仍然能为我提供更好的答案。出于某种原因,从服务器返回的对象具有suds.sax.text。文本类型的枚举,但是使用工厂创建的对象具有与枚举相关的类型,因此这有效:

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]

然后我可以做:

 printEnums(foo,'enumInstance')

即使foo从服务器返回而不是由工厂创建,也会得到foo.enumInstance可能值的列表,因为我工厂创建了一个与传入的类相同类型的新类。但是,我无法想象这种混乱是正确/最佳的方式。

答案 2 :(得分:0)

看看你是否可以将WSDL提供给Python上的ElementTree组件并使用它来获取枚举。