Python / Suds: тип не найден: 'xs: complexType' - PullRequest
10 голосов
/ 25 августа 2009

У меня есть следующий простой тестовый скрипт Python, который использует Suds для вызова веб-службы SOAP (служба написана на ASP.net):

from suds.client import Client

url = 'http://someURL.asmx?WSDL'

client = Client( url )

result = client.service.GetPackageDetails( "MyPackage"  )

print result

Когда я запускаю этот тестовый скрипт, я получаю следующую ошибку (используется разметка кода, поскольку она не переносится):

No handlers could be found for logger "suds.bindings.unmarshaller"
Traceback (most recent call last):
  File "sudsTest.py", line 9, in <module>
    result = client.service.GetPackageDetails( "t3db"  )
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/client.py", line 240, in __call__
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/client.py", line 379, in call
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/client.py", line 240, in __call__
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/client.py", line 422, in call
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/client.py", line 480, in invoke
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/client.py", line 505, in send
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/client.py", line 537, in succeeded
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/bindings/binding.py", line 149, in get_reply
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/bindings/unmarshaller.py", line 303, in process
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/bindings/unmarshaller.py", line 88, in process
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/bindings/unmarshaller.py", line 104, in append
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/bindings/unmarshaller.py", line 181, in append_children
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/bindings/unmarshaller.py", line 104, in append
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/bindings/unmarshaller.py", line 181, in append_children
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/bindings/unmarshaller.py", line 104, in append
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/bindings/unmarshaller.py", line 181, in append_children
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/bindings/unmarshaller.py", line 102, in append
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/bindings/unmarshaller.py", line 324, in start
suds.TypeNotFound: Type not found: 'xs:complexType'

Просмотр источника для заголовка файла WSDL (отформатирован, чтобы соответствовать):

<?xml version="1.0" encoding="utf-8" ?> 
<wsdl:definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" 
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
xmlns:s="http://www.w3.org/2001/XMLSchema" 
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:tns="http://http://someInternalURL/webservices.asmx" 
xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" 
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" 
targetNamespace="http://someURL.asmx" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">

Я предполагаю, основываясь на последней строке вывода:

suds.TypeNotFound: Type not found: 'xs:complexType'

Что мне нужно использовать докторский класс Суда , чтобы исправить схему, но, будучи новичком SOAP, я не знаю, что именно нужно исправить в моем случае. У кого-нибудь здесь есть опыт использования Suds для исправления / исправления схемы?

1 Ответ

14 голосов
/ 01 сентября 2009

Ewall - хороший ресурс. Если вы попытаетесь выполнить поиск по билетам suds trac, вы увидите, что у других людей есть проблемы , подобные вашим , но с другими типами объектов. Это может быть хорошим способом извлечь уроки из его примеров и того, как они импортируют свои пространства имен.

Проблема в том, что ваш wsdl содержит определение схемы, которое ссылается (...), но не удается импортировать «http://schemas.xmlsoap.org/soap/encoding/" пространство имен (и связанная схема) должным образом. Схема может быть исправлена ​​на время выполнения с использованием схемы ImportDoctor как обсуждено здесь: https://fedorahosted.org/suds/wiki/Documentation#FIXINGBROKENSCHEMAs.

Это довольно распространенная проблема.

Схема, на которую обычно ссылаются (то есть не импортируется) это раздел SOAP 5 схема кодирования. Теперь это можно исправить следующим образом:

(все внимание было мое).

Вы можете попробовать строки, которые эти документы предоставляют, добавляя пространства имен, представленные в вашем WSDL. Это может быть метод проб и ошибок.

imp = Import('http://schemas.xmlsoap.org/soap/encoding/')
# Below is your targetNamespace presented in WSDL. Remember
# that you can add more namespaces by appending more imp.filter.add
imp.filter.add('http://someURL.asmx') 
doctor = ImportDoctor(imp) 
client = Client(url, doctor=doctor)

Вы не предоставили WSDL, с которым работаете, я полагаю, у вас есть причины не показывать нам ... поэтому я думаю, что вы должны попробовать эти возможности самостоятельно. Удачи!

...