2

pythonバージョン2.7.1でsudsバージョン0.4を使用してSOAPAPIにアクセスしようとしていますが、 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を使用していくつかのバリエーションを試しましたが、同じエラーが発生します。

sudからの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"/>

別のファイルで定義されています。

このAPIのマネージャーが主張するようにこのWSDLがWSI-BP1.0に準拠しているかどうか、または問題が「ref」属性を適切に処理できないsudにあるかどうかはわかりません。

いずれにせよ、正常に作成されたsudsClientオブジェクトに満足しています。

4

1 に答える 1

2

xsd ファイルの内容を解析する前にドキュメントに直接ロードするために DocumentPluginを作成することで、この問題を解決しました。

ロードされた関数をオーバーライドし、minidomを使用して実行する必要がありました(ただし、任意の xml ライブラリが機能します)。suds要素parsedを簡単に作成できなかったため、関数をオーバーライドできませんでした(おそらく範囲外の情報を含む変数が必要です)。options

suds は DocumentPlugin の作成をここに文書化します。

于 2012-06-18T03:50:56.813 に答える