TypeError в запросе SOAP (с использованием pysimplesoap)

Я пытаюсь получить релевантную информацию из службы SOAP из голландского государственного земельного регистра ( WSDL здесь ) с 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 } } } } ) 

Этот «любопытный» работает. Я установил trace=True поэтому я получаю подробные сообщения журнала, и в этих сообщениях журнала я вижу огромный XML-результат ( вставьте сюда ), который в значительной степени включает всю информацию, которую я запрашиваю. НО, я также получаю эту трассировку:

 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) 

Насколько я понимаю, это означает, что тег IMKAD_Perceel не может быть понят парсером simplexml, который (я предполагаю) заключается в том, что он не мог прочитать / найти определение этого тега в файле wdsl.

Поэтому я проверил (огромное количество) сообщений журнала от разбора файла wsdl и показал следующие строки:

 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 

Я предполагаю, что эти строки означают, что определение IMKAD_Perceel пуст. Поэтому я использовал SoapUI для интроспекции файла WSDL , в котором я нашел URL-адрес этого .xsd-файла, в котором я нашел определение IMKAD_Perceel :

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

Кажется, что тег закрывается, что означает, что он пуст. Это причина, по которой pysimplesoap считает, что IMKAD_Perceel не определен? Почему он не может просто интерпретировать xml и возвращать его как dict? (как было сказано ранее, полный xml-вывод, который я получаю, находится в этой пасте ).

Кто-нибудь знает, как я могу заставить pysimplesoap интерпретировать xml и преобразовать его в dict, независимо от того, придерживается ли он wsdl?

Все советы приветствуются!

  • Как получить идентификатор рабочего листа из Google Spreadsheet с помощью python?
  • Как обновить / изменить XML-файл в python?
  • Как получить полный XML или HTML-контент элемента с помощью ElementTree?
  • Python, как удалить пробелы из текстовых узлов XML
  • Доступ к атрибуту XMLNS с помощью Python Elementree?
  • вставка новых строк в xml-файл, созданный с помощью xml.etree.ElementTree в python
  • Запуск памяти с использованием python ElementTree
  • Как вы получаете djangorestframework для возврата xml с использованием суффикса формата?
  • One Solution collect form web for “TypeError в запросе SOAP (с использованием pysimplesoap)”

    Кажется, что pysimplesoap не может иметь дело с substitutionGroup в xml-схеме.

    Вы можете увидеть это в файле xsd:

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

    Существует такая группа substitutionGroup , что означает, что IMKAD_Perceel и IMKAD_OnroerendeZaak – одно и то же и взаимозаменяемы друг для друга.

    В схеме мыла эта часть ответа определяется как:

     <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> 

    Однако вы можете видеть, что фактический ответ выглядит так:

     <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> 

    Тогда pysimplesoap похоже, запутался и не получил правильного типа ответа.

    Python - лучший язык программирования в мире.