2010-06-12 69 views
3

我用肥皂水客戶端連接到一個SOAP服務器,其WSDL包含許多枚舉類似如下:包含清單與Python肥皂水SOAP枚舉所有可能的值

</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的缺點。

編輯:我發現一種方式來獲得給出的簡單類型名稱的枚舉,如下,所以我的問題縮小到給定變量findingthe類型名稱,因爲類型(x)返回suds.sax .text.Text,而不是真實姓名

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

回答

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的可能值的列表,因爲我的工廠創建了一個與傳入的類相同類型的新類。不過,我無法想象這種混亂是做到這一點的正確/最佳方式。

0

看看你是否可以在WSDL送入關於Python的ElementTree組件,並用它來獲得枚舉。

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])