我正在尝试使用suds version 0.4和python版本2.7.1来访问soap api,但是我在尝试创建Client对象时遇到错误。最简单的形式是:
from suds.client import Client
url = 'http://tool-sb-api.hescloud.net/session/wsdl'
c = Client(url, cache=None)
产生的错误是:
suds.TypeNotFound: Type not found: '(retrieveSessionByIdResponse, http://hes.lbl.gov/scoring_tool/session, )'
我根据ImportDoctor方法使用documented尝试了一些变体,但我得到了同样的错误。
在检查来自suds的WSDL和调试消息时,它似乎有一个包含列表
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://hes.lbl.gov/scoring_tool/session" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" name="HesAPI_Session" targetNamespace="http://hes.lbl.gov/scoring_tool/session">
<types>
<xsd:schema targetNamespace="http://hes.lbl.gov/scoring_tool/session">
<xsd:include schemaLocation="http://tool-sb-api.hescloud.net/public/xsd/session/input/newSessionFromAddress.xsd"/>
<xsd:include schemaLocation="http://tool-sb-api.hescloud.net/public/xsd/session/output/newSessionFromAddressResponse.xsd"/>
<xsd:include schemaLocation="http://tool-sb-api.hescloud.net/public/xsd/session/input/newLabelSession.xsd"/>
...
相互引用。以下是执行此操作的示例xsd(newSessionFromAddressResponse.xsd)。
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="http://hes.lbl.gov/scoring_tool/session" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://hes.lbl.gov/scoring_tool/session">
<xsd:element name="newSessionFromAddressResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="returnCode" type="xsd:int"/>
<xsd:element name="returnComment" type="xsd:string"/>
<xsd:element name="readOnly" type="xsd:string"/>
<xsd:element ref="tns:AddressList"/>
<!-- RetrieveSessionByIdResponse is defined in retrieveSessionByIdResponse.xsd. In the event of an error, we won't have a retrieveSessionByIdResponse, hence minOccurs=0 -->
<xsd:element ref="tns:retrieveSessionByIdResponse" minOccurs="0" maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="AddressList">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="address" type="xsd:string"/>
<xsd:element name="city" type="xsd:string"/>
<xsd:element name="state" type="xsd:string"/>
<xsd:element name="zipcode" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
似乎肥皂水有问题
<xsd:element ref="tns:retrieveSessionByIdResponse" minOccurs="0" maxOccurs="1"/>
在不同的文件中定义。
我不确定此WSDL是否遵循WSI-BP 1.0作为此API声明的管理者,或者问题是suds无法正确处理“ref”属性。
无论哪种方式,我都会对成功创建的suds Client对象感到满意。
答案 0 :(得分:2)
我通过创建DocumentPlugin来解决此问题,以便在解析之前将xsd文件的内容直接加载到文档中。
我必须覆盖loaded函数并使用minidom执行此操作(尽管任何xml库都可以)。我无法覆盖parsed
函数,因为我无法轻松创建suds Element(它需要一个包含可能超出范围的信息的options
变量。)
suds记录了DocumentPlugin here的创建。