2009-08-25 6 views
10

Ich habe den folgenden einfachen Python Testskript, das Suds verwendet einen SOAP-Web-Service anrufen (der Dienst in ASP.net geschrieben):Python/Suds: Typ wird nicht gefunden: 'xs: complex'

from suds.client import Client 

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

client = Client(url) 

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

print result 

Wenn ich diesen Test Skript ausführen ich erhalte die folgende Fehlermeldung (verwendeter Code Markup wie es wickelt nicht):

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' 

an der Quelle der Suche nach der Header der WSDL-Datei (umformatiert passen):

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

Ich bin zu raten, basierend auf der letzten Zeile der Ausgabe:

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

, die ich brauche doctor class Sud zu verwenden, um das Schema zu beheben, aber ich einen SOAP-Neuling ist nicht genau wissen, Bedürfnisse, was in meinem Fall festgelegt. Hat jemand hier Erfahrung mit Suds zu reparieren/korrigieren Schema?

+1

Ich habe gerade versucht, eine einfache C# -Test-Anwendung und es kann sich mit diesem Service gut verbinden (aber dann ist der Dienst ASP.net basiert). Könnte es etwas Spezifisches sein, das Suds standardmäßig nicht unterstützt? – Danielb

+0

Es sieht so aus, als ob der Dienst versucht, ein DataSet zurückzugeben. Ich sehe Folgendes im Logger: WARNUNG: suds.bindings.unmarshaller: Attribut (IsDataSet) Typ, nicht gefunden WARNUNG: suds.bindings.unmarshaller: Attribut (Name) Typ, nicht gefunden FEHLER: Schaum .bindings.unmarshaller: Schema: 0x7fce048c – Danielb

+0

Hört sich an, als ob SUDS nicht von einem -Tag importiert, das die Struktur des Datensatzes angibt. Haben Sie Ihre WSDL nach Importen durchsucht? Wenn das die Antwort ist, dann sollte der ImportDoctor von SUDS helfen können. Beispiele auf https://fedorahosted.org/suds/wiki/Documentation#FIXINGBROKENSCHEMAs – ewall

Antwort

15

Ewall 's Ressource ist eine gute. Wenn Sie versuchen, in suds trac tickets zu suchen, können Sie sehen, dass andere Personen Probleme mit unterschiedlichen Objekttypen haben. Es kann eine gute Möglichkeit sein, aus seinen Beispielen zu lernen und wie sie ihre Namespaces importieren.

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:

(alle Schwerpunkte waren meins).

Sie könnten versuchen, die Zeilen, die diese Dokumentationen bieten, die Namespaces hinzuzufügen, die in Ihrer WSDL präsentiert werden. Dies kann ein Versuch-und-Fehler-Ansatz sein.

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) 

Sie nicht die WSDL vorsah mit dem Sie arbeiten, ich nehme an, Sie Gründen nicht zeigen uns haben ... also ich glaube, Sie diese Möglichkeiten selbst zu versuchen. Viel Glück!

+0

Ich kann nicht scheinen, dies als die Antwort aus irgendeinem Grund zu akzeptieren :( – Danielb

+0

Ich weiß, es löst Ihr Problem nicht vollständig ... aber seit Sie können nicht Ihre WSDL bereitstellen, ich kann nicht versuchen, das genaue Problem in dieser Situation herauszufinden, also habe ich versucht, Ihnen mit einigen allgemeinen "blinden Debugging-Tipps" zu helfen, um zu sehen, ob Sie selbst in dem Problem vorankommen könnten seit du diesen Kommentar geschrieben hast, hast du wahrscheinlich keine Lösung für dein Problem gefunden ... hast du die offizielle Suds-Unterstützung versucht? – GmonC