【问题标题】:Listing all possible values for SOAP enumeration with Python SUDS使用 Python SUDS 列出 SOAP 枚举的所有可能值
【发布时间】:2010-06-12 03:02:41
【问题描述】:

我正在使用 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]

【问题讨论】:

    标签: python soap enumeration suds


    【解决方案1】:

    如果您知道所需枚举的名称,您应该能够将 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])
    

    【讨论】:

      【解决方案2】:

      我想出了一个相当老套的方法来解决这个问题,但希望有人仍然可以为我提供更好的答案。出于某种原因,从服务器返回的对象具有 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 的可能值列表,因为我工厂创建了一个与传入的类相同类型的新类。不过,我无法想象这种混乱是正确/最好的方法。

      【讨论】:

        【解决方案3】:

        看看您是否可以将 WSDL 输入 Python 上的 ElementTree 组件并使用它来获取枚举。

        【讨论】:

          猜你喜欢
          • 2010-11-24
          • 2012-06-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-30
          • 2011-07-19
          • 2017-06-21
          • 1970-01-01
          相关资源
          最近更新 更多