我正在尝试通过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输出(粘贴在此处),其中几乎包含了我请求的所有信息。但是,我也得到此回溯:
trace=True
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文件中该标签的定义。
IMKAD_Perceel
因此,我检查了解析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输出在此粘贴中)。
有人知道我如何使pysimplesoap解释xml并将其转换为dict,无论它是否遵守wsdl吗?
欢迎所有提示!
似乎pysimplesoap无法substitutionGroup在xml模式中处理。
pysimplesoap
substitutionGroup
您可以在xsd文件中看到:
存在this substitutionGroup,这意味着IMKAD_Perceel和IMKAD_OnroerendeZaak是相同的事物并且可以相互替代。
IMKAD_OnroerendeZaak
在soap模式中,响应的这一特定部分定义为:
<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似乎会感到困惑,并且无法获得正确的响应类型。