2009-07-27 2 views
0

У меня есть веб-сервис, который возвращает следующий тип:Почему Python пропускает атрибут в сообщении SOAP?

<xsd:complexType name="TaggerResponse"> 
    <xsd:sequence> 
     <xsd:element name="msg" type="xsd:string"></xsd:element> 
    </xsd:sequence> 
    <xsd:attribute name="status" type="tns:Status"></xsd:attribute> 
</xsd:complexType> 

Тип содержит один элемент (msg) и один атрибут (status).

Для связи с веб-службой я использую библиотеку SOAPpy. Ниже приведен пример результата возвращение веб-службы (SOAP-сообщение):

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Body> 
     <SOAP-ENV:TagResponse> 
     <parameters status="2"> 
      <msg>text</msg> 
     </parameters> 
     </SOAP-ENV:TagResponse> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Python разбирает это сообщение как:

<SOAPpy.Types.structType parameters at 157796908>: {'msg': 'text'} 

Как вы можете увидеть атрибут утрачивается. Что делать, чтобы получить значение «status»?

ответ

1

Пример ответа, который вы опубликовали (фактический XML, возвращающийся из запроса WS), не имеет значения, которое вы ищете! Я бы сказал, поэтому SOAPpy не может вернуть его вам.

Если это случай создания кода имеют согласованное поведение в тех случаях, когда возвращается значение, а когда нет, то попробуйте использовать dict «s get() метод, чтобы получить значение:

attribute_value = result.get("attribute", None) 

Тогда вы можете проверить результат на отсутствие. Вы также можете сделать это следующим образом:

if not "attribute" in result: 
    ...handle case where there is no attribute value... 
+0

Я хочу, чтобы значение «status» находилось в сообщении. Метод 'get' не работает для результата:' экземпляр structType не имеет атрибута get''. Однако вы ответили мне подсказкой, и я узнал, что используя 'r._getAttr (« status »)' значение, которое я ищу. Но ... '_getAttr' - внутренняя функция, и я могу ее использовать или есть более подходящий способ получить значение? – czuk

+1

czuk: если класс наследует объект, вы можете использовать встроенный getattr(). Например getattr (результат, «статус», «Нет») вернет значение статуса в результате или «Нет», если оно не было установлено. – jkp

+0

Функция 'getattr' также не существует. Интересно, может ли это быть проблемой с объявлением WSDL. Один из валидаторов говорит, что атрибут пространства имен отсутствует. Я работаю над этим. – czuk