2015-05-15 4 views
9

Ich versuche, relevante Informationen von einem SOAP-Service aus dem niederländischen Grundbuch (WSDL here) mit PySimpleSoap zu erhalten. Bisher konnte ich die Verbindung und fordern Sie Informationen zu einem bestimmten Objekt mit dem folgenden Code:TypeError in SOAP-Anfrage (mit pysimplesoap)

from pysimplesoap.client import SoapClient 
client = SoapClient(wsdl='http://www1.kadaster.nl/1/schemas/kik-inzage/20141101/verzoekTotInformatie-2.1.wsdl', username='xxx', password='xxx', trace=True) 

response = client.VerzoekTotInformatie(
    Aanvraag={ 
     'berichtversie': '4.7', # Refers to the schema version 
     'klantReferentie': klantReferentie, # A reference we can set ourselves. 
     'productAanduiding': '1185', # a four-digit code referring to whether the response should be in "XML" (1185), "PDF" (1191) or "XML and PDF" (1057). 
     'Ingang': { 
      'Object': { 
       'IMKAD_KadastraleAanduiding': { 
        'gemeente': 'ARNHEM AC', # municipality 
        'sectie': 'AC', # section code 
        'perceelnummer': '1234' # Lot number 
       } 
      } 
     } 
    } 
) 

Dieses „irgendwie“ funktioniert. Ich setze trace=True, also erhalte ich umfangreiche Protokollnachrichten, und in diesen Protokollnachrichten sehe ich eine humongous XML-Ausgabe (paste here), die ziemlich alle Informationen einschließt, die ich anfordere. ABER, ich bekomme auch diese Zurückverfolgungs:

Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
    'perceelnummer': perceelnummer 
    File "/Library/Python/2.7/site-packages/pysimplesoap/client.py", line 181, in <lambda> 
    return lambda *args, **kwargs: self.wsdl_call(attr, *args, **kwargs) 
    File "/Library/Python/2.7/site-packages/pysimplesoap/client.py", line 346, in wsdl_call 
    return self.wsdl_call_with_args(method, args, kwargs) 
    File "/Library/Python/2.7/site-packages/pysimplesoap/client.py", line 372, in wsdl_call_with_args 
    resp = response('Body', ns=soap_uri).children().unmarshall(output) 
    File "/Library/Python/2.7/site-packages/pysimplesoap/simplexml.py", line 433, in unmarshall 
    value = children and children.unmarshall(fn, strict) 
    File "/Library/Python/2.7/site-packages/pysimplesoap/simplexml.py", line 433, in unmarshall 
    value = children and children.unmarshall(fn, strict) 
    File "/Library/Python/2.7/site-packages/pysimplesoap/simplexml.py", line 433, in unmarshall 
    value = children and children.unmarshall(fn, strict) 
    File "/Library/Python/2.7/site-packages/pysimplesoap/simplexml.py", line 380, in unmarshall 
    raise TypeError("Tag: %s invalid (type not found)" % (name,)) 
TypeError: Tag: IMKAD_Perceel invalid (type not found) 

Soweit ich verstehe, bedeutet dies, dass die IMKAD_Perceel Tag kann nicht von der simplexml parser zu verstehen, die (ich vermute ich), weil es nicht/finden die Definition lesen konnte dieses Tags in der WDSL-Datei.

So überprüfte ich die (enorme Menge an) Log-Meldungen aus der WSDL-Datei Parsen, und das zeigt diese Zeilen:

DEBUG:pysimplesoap.helpers:Parsing Element element: IMKAD_Perceel 
DEBUG:pysimplesoap.helpers:Processing element IMKAD_Perceel element 
DEBUG:pysimplesoap.helpers:IMKAD_Perceel has no children! 
DEBUG:pysimplesoap.helpers:complexContent/simpleType/element IMKAD_Perceel = IMKAD_Perceel 
DEBUG:pysimplesoap.helpers:Parsing Element complexType: IMKAD_Perceel 
DEBUG:pysimplesoap.helpers:Processing element IMKAD_Perceel complexType 
DEBUG:pysimplesoap.helpers:complexContent/simpleType/element IMKAD_Perceel = IMKAD_OnroerendeZaak 
DEBUG:pysimplesoap.helpers:Processing element IMKAD_Perceel complexType 

Ich denke, diese Zeilen bedeuten, dass die IMKAD_Perceel Definition leer ist. So habe ich SoapUIthe WSDL file introspect, in dem ich an url to this .xsd-file in denen fand ich eine Definition des IMKAD_Perceel finden:

<xs:element name="IMKAD_Perceel" 
    substitutionGroup="ipkbo:IMKAD_OnroerendeZaak" 
    type="ipkbo:IMKAD_Perceel" 
    /> 

Der Tag in der Tat scheint sich zu schließen, was bedeutet, dass er leer ist. Ist dies der Grund, dass pysimplesoap denkt, dass IMKAD_Perceel nicht definiert ist? Warum kann das XML nicht einfach interpretiert und als dict zurückgegeben werden? (Wie bereits erwähnt, ist die vollständige XML-Ausgabe, die ich erhalte, in this paste).

Weiß jemand, wie ich pysimplesoap interpretieren kann das XML und konvertieren Sie es in ein Diktat, unabhängig davon, ob es an der WSDL hält?

Alle Tipps sind willkommen!

+0

Wir können den Fehler nicht reproduzieren, da wir nicht zur Nutzung dieses Dienstes berechtigt sind. Ich denke, es ist besser für Sie, den Anbieter dieses Webdienstes zu kontaktieren. – skyline75489

+0

@ skyline75489 - Ich habe eine Paste der XML, die ich zurück erhalte, hinzugefügt: http://pastebin.com/eamQzGSt. Hilft das beim Debuggen? – kramer65

+0

Die Antwort, die Sie erhalten, scheint in Ordnung zu sein, selbst wenn sie sich über 'type error' beschwert. Gibt es ein Problem mit der Antwort? – skyline75489

Antwort

1

Es scheint, dass pysimplesoap nicht in der Lage ist, mit substitutionGroup in XML-Schema umzugehen.

Sie können, dass in der XSD-Datei sehen:

<xs:element name="IMKAD_Perceel" 
substitutionGroup="ipkbo:IMKAD_OnroerendeZaak" 
type="ipkbo:IMKAD_Perceel" 
/> 

Es gibt diese substitutionGroup, was bedeutet, dass IMKAD_Perceel und IMKAD_OnroerendeZaak die gleiche Sache ist und substituierbar für einander.

<ipkbo:BerichtGegevens> 
    <ipkbo:IMKAD_Perceel>...</ipkbo:IMKAD_Perceel> 
    <ipkbo:Recht>...</ipkbo:Recht> 
    <ipkbo:IMKAD_AangebodenStuk>...</ipkbo:IMKAD_AangebodenStuk> 
    <ipkbo:IMKAD_Persoon>...</ipkbo:IMKAD_Persoon> 
</ipkbo:BerichtGegevens> 

Dann pysimplesoap scheint verwirrt und:

<xs:complexType name="BerichtGegevens"> 
<xs:annotation> 
    <xs:documentation>Inhoud van het bericht.</xs:documentation>  
</xs:annotation> 
<xs:sequence> 
    <xs:element ref="ipkbo:IMKAD_OnroerendeZaak" minOccurs="1" maxOccurs="1"/> 
    <xs:element ref="ipkbo:Recht" minOccurs="1" maxOccurs="1"/><xs:element ref="ipkbo:IMKAD_Stuk" minOccurs="0" maxOccurs="unbounded"/> 
    <xs:element ref="ipkbo:IMKAD_Persoon" minOccurs="1" maxOccurs="unbounded"/> 
    <xs:element ref="ipkbo:GemeentelijkeRegistratie" minOccurs="0" maxOccurs="unbounded"/> 
</xs:sequence> 
</xs:complexType> 

Sie die eigentliche Antwort ist wie sehen jedoch:

Im Seife Schema, diese besondere Antwort Teil ist definiert als nicht die richtige Art der Antwort erhalten.

+0

Vielen Dank für Ihre gründliche Analyse und Erklärung der Fehlerquelle. Hättest du möglicherweise auch eine Ahnung, wie ich es lösen könnte? Die Quelle von simplexml ist in der pysimplesource enthalten (https://github.com/pysimplesoap/pysimplesoap/blob/master/pysimplesoap/simplexml.py). Hättest du eine Idee, wie ich das bearbeiten kann, um 'substitutionGroups' Arbeit zu bekommen? – kramer65

+0

Sie können versuchen, es mit 'types ['IMKAD_Perceel'] = types ['IMKAD_OnroerendeZaak']' zu hacken. Fügen Sie das einfach der Funktion "unmarshall" zu Beginn hinzu. – skyline75489

+0

Wenn ich versuche, bekomme ich einen Key Error: 'Datei" pysimplesoap/simplexml.py ", Zeile 325, in unmarshall Typen ['IMKAD_Perceel'] = Typen ['IMKAD_OnroerendeZaak'] KeyError: u'IMKAD_OnroerendeZaak''. 'IMKAD_OnroerendeZaak' ist angeblich auch nicht in den Typen geladen. Irgendeine andere Idee? – kramer65