Перечисление всех возможных значений для перечисления SOAP с Python SUDS - PullRequest
3 голосов
/ 12 июня 2010

Я подключаюсь с клиентом 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.

Edit: Я нашел способ получить перечисления по имени simpleType, как показано ниже, поэтому моя проблема сводится к поиску имени типа для данной переменной, учитывая, что type (x) возвращает suds.sax.text.Текст вместо настоящего имени

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

Ответы [ 3 ]

3 голосов
/ 16 февраля 2011

Если вы знаете имя нужного вам перечисления, вы должны иметь возможность обрабатывать перечисления, которые выдает объект перечисления, как словарь, и выполнять прямой поиск по этому имени. Например, если ваш тип перечисления называется 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 голос
/ 12 июня 2010

Я нашел довольно хакерский способ справиться с этим, но, надеюсь, у меня все еще есть лучший ответ для меня.По какой-то причине объекты, возвращаемые с сервера, имеют перечисления с типом suds.sax.text .Text, но объекты, созданные с помощью фабрики, имеют типы, связанные с перечислением, поэтому это работает:

 printEnums(foo,'enumInstance')

, и даже если foo был возвращен с сервера и не создан фабрикой, получить список возможных значений для foo.enumInstance, так как я фабрично создаю новый класс того же типа, что и класспередал. Тем не менее, я не могу себе представить, что этот беспорядок является правильным / лучшим способом сделать это.

0 голосов
/ 12 июня 2010

Посмотрите, можете ли вы вставить WSDL в компонент ElementTree на Python и использовать его для получения перечислений.

...