PySimpleSoapを使用して、オランダ政府の土地登記簿 (ここでは WSDL )から SOAP サービスから関連情報を取得しようとしています。これまでのところ、次のコードを使用して、特定のプロパティに関する情報を接続して要求することができました。
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)
私が理解している限り、これはsimplexml パーサーIMKAD_Perceel
がタグを理解できないことを意味します。これは、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 ファイルをイントロスペクトし、この .xsd ファイルへの URL を見つけましたIMKAD_Perceel
。
<xs:element name="IMKAD_Perceel"
substitutionGroup="ipkbo:IMKAD_OnroerendeZaak"
type="ipkbo:IMKAD_Perceel"
/>
タグは実際にそれ自体を閉じているように見えます。つまり、タグは空です。これが pysimplesoap がIMKAD_Perceel
定義されていないと考える理由ですか? 単純にxmlを解釈してdictとして返すことができないのはなぜですか? (前に述べたように、私が受け取る完全なxml出力はこのペーストにあります)。
wsdlに準拠しているかどうかに関係なく、pysimplesoapにxmlを解釈させて辞書に変換させる方法を知っている人はいますか?
すべてのヒントは大歓迎です!