2015-05-15 16 views
9

Bir SOAP hizmetinden ilgili bilgileri, Hollanda hükümeti kayıt defterinden (WSDL here) PySimpleSoap ile almaya çalışıyorum.SOAP isteğinde TypeError (pysimplesoap kullanarak)

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

Bu "tür" çalışır: Şimdiye kadar bağlanıp aşağıdaki kodla belirli özellik hakkında bilgi istemek başardı. trace=True'u ayarlıyorum, böylece kapsamlı günlük mesajları alıyorum ve bu günlük mesajlarında, istediğim tüm bilgileri içeren çok fazla xml çıkışı (paste here) görüyorum. ANCAK, ben de bu Traceback olsun:

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) 

Bildiğim kadarıyla anladığım kadarıyla, bu IMKAD_Perceel etiketi (Ben tahmin ediyorum) simplexml parser tarafından anlaşılamaz demektir bu tanım bulmak/okuyamadı çünkü Bu etiketin wdsl dosyasında.

yüzden (muazzam miktarda) wsdl dosyasını ayrıştırma gelen iletileri günlüğe işaretlendiğini ve bu satırları gösterir:
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 

Ben bu satırlar IMKAD_Perceel tanımı boş olduğu anlamına sanırım.

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

etiketi gerçekten kendini yaklaşıyor gibi görünüyor, bu boş olduğu anlamına gelir: Ben hangi ı IMKAD_Perceel tanımını bulmak ben an url to this .xsd-file bulduğu, the WSDL file iç gözlem SoapUI kullandı. Bu, pysimplesoap'ın IMKAD_Perceel'un tanımlanmadığını düşünmesinin sebebi midir? Neden sadece xml'yi yorumlayamaz ve bir dict olarak geri gönderemez? (Daha önce de söylediğim gibi, aldığım tam xml çıktısı this paste).

Herhangi bir kimse, psi zihnini yorumlayabileceğimi ve xsdl'e uyup uymadığına bakmadan nasıl bir dict'e dönüştürdüğümü biliyor mu?

Tüm ipuçları kabul edilir!

+0

Bu hizmeti kullanma yetkimiz olmadığı için hatayı yeniden oluşturamıyoruz. Bu web servis sağlayıcısına başvurmanızın daha iyi olacağını düşünüyorum. – skyline75489

+0

@ skyline75489 - Geri aldığım xml'nin bir macunu ekledim: http://pastebin.com/eamQzGSt. Bu hata ayıklamaya yardımcı olur mu? – kramer65

+0

Aldığınız yanıt Tamam görünüyor, hatta "tip hatası" dan şikayet ediyor. Yanıtla ilgili bir sorun var mı? – skyline75489

cevap

1

pysimplesoap'un xml şemada substitutionGroup ile çalıştığı anlaşılıyor.

Sen Xsd dosyasında görebilirsiniz:

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

IMKAD_Perceel ve IMKAD_OnroerendeZaak birbirleri için aynı şey ve ikame olduğu anlamına gelir bu substitutionGroup yoktur.

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

Sonra pysimplesoap karışık görünüyor ve: Ancak

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

, gerçek yanıtı gibidir görebilirsiniz: sabun şemada

, tepkinin bu özel bölümü olarak tanımlanır Doğru cevap türünü alamamak.

+0

Ayrıntılı analiziniz ve hatanın kaynağının açıklaması için teşekkür ederiz. Bunu nasıl çözebileceğime dair bir fikrin var mı? Simplexml kaynağı, pysimplesource ile birlikte gelir (https://github.com/pysimplesoap/pysimplesoap/blob/master/pysimplesoap/simplexml.py). 'SubstitutionGroup'un çalışmasını sağlamak için bunu nasıl düzenleyebileceğimi biliyor musunuz? – kramer65

+0

"[IMKAD_OnroerendeZaak ']' türlerini kullanarak kesmeyi deneyebilirsiniz. Sadece bunun başında 'unmarshall' işlevine ekleyin. – skyline75489

+0

Bunu denediğimde bir Anahtar Hata alıyorum: 'Dosya" pysimplesoap/simplexml.py ", satır 325, unmarshall türlerinde ['IMKAD_Perceel'] = tür ['IMKAD_OnroerendeZaak'] KeyError: u'IMKAD_OnroerendeZaak '. 'IMKAD_OnroerendeZaak' da türlerde yüklü değildir. Başka bir fikrin var mı? – kramer65