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

3 投票
3 回答
3755 浏览
提问于 2025-04-15 23:52

我正在用一个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'>

我不太确定如何从中获取实际的简单类型名称,然后再从这个名称中获取可能的值,除非我自己解析WSDL。

编辑:我发现了一种方法,可以根据简单类型名称获取枚举,如下所示,所以我现在的问题变成了如何找到给定变量的类型名称,因为type(x)返回的是suds.sax.text.Text,而不是实际的名称。

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

3 个回答

0

试着把WSDL文件放进Python的ElementTree组件里,然后用它来获取枚举值。

3

如果你知道你想要的枚举(enum)的名称,那么你可以把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

我找到了一种比较“hacky”的方法来解决这个问题,但希望有人能给我更好的答案。出于某种原因,从服务器返回的对象有一种叫做 suds.sax.text.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 的所有可能值,因为我通过工厂创建了一个与传入的类型相同的新类。不过,我真的不觉得这种方法是正确或最好的解决方案。

撰写回答