2

我正在尝试使用suds 0.4 版和 python 2.7.1 版来访问肥皂 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尝试了一些变体,但我得到了同样的错误。

在检查 WSDL 和来自 suds 的调试消息后,它似乎有一个包含列表

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

suds 似乎有问题

<xsd:element ref="tns:retrieveSessionByIdResponse" minOccurs="0" maxOccurs="1"/>

在不同的文件中定义。

我不确定此 WSDL 是否遵循WSI-BP 1.0作为此 API 声明的管理者,或者问题是否在于 suds 无法正确处理“ref”属性。

无论哪种方式,我都会对成功创建的 suds Client 对象感到满意。

4

1 回答 1

2

我通过创建DocumentPlugin解决了这个问题,以便在解析之前将 xsd 文件的内容直接加载到文档中。

我必须重写加载的函数并使用minidom来完成(尽管任何 xml 库都可以工作)。我无法覆盖该parsed函数,因为我无法轻松创建 suds元素(它需要一个options包含可能超出范围的信息的变量)。

suds 在此处记录了 DocumentPlugin 的创建。

于 2012-06-18T03:50:56.813 回答