3

SUDS クライアントを使用して、wsdl に次のような多くの列挙が含まれている 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'>

これから実際の simpleType 名を取得する方法がわかりません。また、自分で WSDL を解析する以外に可能な値を取得する方法もわかりません。

編集:以下のように、simpleType 名を指定して列挙を取得する方法を発見しました。本名

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

3 に答える 3

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])
于 2011-02-16T00:44:59.513 に答える
1

私はこれをやってのけるかなりハックな方法を考え出しましたが、誰かがまだ私にとってより良い答えを持っていることを願っています. 何らかの理由で、サーバーから返されたオブジェクトには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 の可能な値のリストを取得します。それでも、できませんこの混乱がこれを行うための正しい/最良の方法であると想像してください。

于 2010-06-12T05:26:54.583 に答える
0

ElementTreePythonのコンポーネントに WSDL をフィードし、それを使用して列挙を取得できるかどうかを確認してください。

于 2010-06-12T04:13:42.203 に答える