2009-08-25 14 views
10

tengo el siguiente guión de prueba pitón que utiliza Suds llamar a un servicio web SOAP (el servicio está escrito en ASP.net):Python/espuma: no tipo que se encuentra: 'xs: complexType'

from suds.client import Client 

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

client = Client(url) 

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

print result 

Cuando ejecuto este script de prueba que estoy recibiendo el siguiente error (se utiliza el marcado de código, ya que no se ajusta):

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' 

en cuanto a la fuente de la cabecera del archivo WSDL (reformateado para encajar):

<?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/"> 

supongo que seguirán basándose en la última línea de la salida:

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

que necesito utilizar Sud de doctor class para fijar el esquema pero al ser un novato de SOAP no sé qué es exactamente necesidades fijos en mi caso. ¿Alguien aquí tiene alguna experiencia en el uso de Suds para corregir/corregir el esquema?

+1

Acabo de probar una aplicación de prueba C# simple y se puede conectar a este servicio bien (pero luego el servicio está basado en ASP.net). ¿Podría ser algo específico de Microsoft que Suds no admite por defecto? – Danielb

+0

Parece que el servicio está intentando devolver un DataSet. Estoy viendo lo siguiente en el registrador: ADVERTENCIA: suds.bindings.unmarshaller: atributo (IsDataSet) tipo, no encontrado ADVERTENCIA: suds.bindings.unmarshaller: tipo de atributo (nombre), no encontrado ERROR: espuma .bindings.unmarshaller: Schema: 0x7fce048c – Danielb

+0

Me parece que SUDS no está importando desde una etiqueta que especifica la estructura del conjunto de datos. ¿Ha buscado en su WSDL para importar? Si esa es la respuesta, entonces ImportDoctor de SUDS debería ser capaz de ayudar. Ejemplos en https://fedorahosted.org/suds/wiki/Documentation#FIXINGBROKENSCHEMAs – ewall

Respuesta

15

El recurso de Ewall es bueno. Si intenta buscar en tickets de suds trac, podría ver que otras personas tienen problemas similar to yours, pero con diferentes tipos de objetos. Puede ser una buena forma de aprender de sus ejemplos y de cómo importan sus espacios de nombres.

The problem is that your wsdl contains a schema definition that references the (...) but fails to import the " http://schemas.xmlsoap.org/soap/encoding/ " namespace (and associated schema) properly. The schema can be patched at runtime using the schema ImportDoctor as discussed here: https://fedorahosted.org/suds/wiki/Documentation#FIXINGBROKENSCHEMAs .

This is a fairly common problem.

A commonly referenced schema (that is not imported) is the SOAP section 5 encoding schema. This can now be fixed as follows:

(todo el énfasis era mío).

Puede probar las líneas que proporcionan estas documentaciones agregando los espacios de nombres presentados en su WSDL. Esto puede ser un enfoque de intento y error.

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) 

No ha proporcionado el WSDL que está trabajando, supongo que tienes razones para no mostrar a nosotros ... así que creo que hay que probar estas posibilidades por sí mismo. ¡Buena suerte!

+0

Parece que no puedo aceptar esto como la respuesta por alguna razón :( – Danielb

+0

Sé que no resuelve completamente su problema ... pero desde no puedes proporcionar tu wsdl, no puedo tratar de resolver el problema exacto en esta situación, así que traté de ayudarte con algunos consejos genéricos de "depuración ciega" para ver si podías avanzar solo en el problema. ya que escribiste este comentario, supongo que no encontraste una solución a tu problema ... ¿has probado el soporte oficial de Suds? – GmonC

Cuestiones relacionadas