小编典典

SOAP请求中的TypeError(使用pysimplesoap)

python

我正在尝试通过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)

据我了解,这意味着该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文件,在其中找到了该.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吗?

欢迎所有提示!


阅读 216

收藏
2021-01-16

共1个答案

小编典典

似乎pysimplesoap无法substitutionGroup在xml模式中处理。

您可以在xsd文件中看到:

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

存在this
substitutionGroup,这意味着IMKAD_PerceelIMKAD_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似乎会感到困惑,并且无法获得正确的响应类型。

2021-01-16