2015-05-15 2 views
9

Я пытаюсь получить релевантную информацию из службы SOAP из земельного кадастра голландского правительства (WSDL here) с PySimpleSoap. До сих пор мне удалось связаться и запросить информацию об определенном имуществе со следующим кодом:TypeError in SOAP Request (using 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-вывод (paste here), который в значительной степени включает в себя всю информацию, которую я запрашиваю. НО, я также получаю эту отслеживающий:

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 parser который (я угадываю), потому что он не может прочитать/найти определение этого тега в файле 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 самоанализ the WSDL file, в котором я нашел an url to this .xsd-file, в котором я нахожу определение IMKAD_Perceel:

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

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

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

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

+0

Мы не можем воспроизвести ошибку, так как мы не имеем права использовать эту услугу. Я думаю, вам лучше связаться с провайдером этого веб-сервиса. – skyline75489

+0

@ skyline75489 - Я добавил пасту xml, которую я получил обратно: http://pastebin.com/eamQzGSt. Помогает ли это отлаживать? – kramer65

+0

Ответ, который у вас есть, кажется, все в порядке, даже он жалуется на «ошибку типа». Есть ли какие-либо проблемы с ответом? – skyline75489

ответ

1

похоже, что 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 кажется запутаться и не получают правильный ответ.

+0

Благодарим вас за подробный анализ и объяснение источника ошибки. Не могли бы вы также понять, как я могу это решить? Источник simplexml включен в источник pysimplesource (https://github.com/pysimplesoap/pysimplesoap/blob/master/pysimplesoap/simplexml.py). Не могли бы вы представить, как я могу изменить это, чтобы заставить 'substitutionGroup' работать? – kramer65

+0

Вы можете попробовать взломать его с помощью 'types ['IMKAD_Perceel'] = types ['IMKAD_OnroerendeZaak']'. Просто добавьте это в функцию «unmarshall» в начале ее. – skyline75489

+0

Если я попробую, я получу ошибку ключа: «Файл« pysimplesoap/simplexml.py », строка 325, в unmarshall типы ['IMKAD_Perceel'] = типы ['IMKAD_OnroerendeZaak'] KeyError: u'IMKAD_OnroerendeZaak''. 'IMKAD_OnroerendeZaak' предположительно также не загружается в типы. Любая другая идея? – kramer65