2017-01-19 10 views
1

私はいくつかの情報を取得するために、zeepを使ってzeepをSOAPクライアントとして使用しています。私はclient.service.ServiceNameの応答がpythonデータ構造体を返すことに気付きましたが、その項目はpythonデータ構造ではなくlxml.etree._Elementです。 zeepにxmlとは対照的にネストされたPython辞書を返す方法があるかどうか教えてください。ここでpython zeepネストされたレスポンスはPythonのデータ構造ではありません

はコードです:client.service.getCard

# python 2.7 
import zeep 
from lxml import etree 
print zeep.__version__ # '0.23.0' 
history = zeep.plugins.HistoryPlugin() 
client = zeep.Client(wsdl=wsdl, 
        wsse=UsernameToken(username, password), 
        plugins=[history]) 
projectId, cardUniqueId, cardType, userLoginId = ('3', '111', 'XXX', 'myuser') 
cards = client.service.getCard(projectId, cardUniqueId, cardType, userLoginId) 
print(type(cards)) # <type 'list'> 
print(cards)   # [<Element {http://kanbancard.webservices.kanban.app.digite.com/}fields at 0x7f706d69e640>] 
print(type(cards[0])) # <type 'lxml.etree._Element'> 

応答は次のとおりです。

print(etree.tounicode(history.last_received['envelope'], pretty_print=True)) 

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
    <ns:getCardResponse xmlns:ns="http://kanbancard.webservices.kanban.app.digite.com/"> 
     <ns:fields> 
     <ns:field ns:name="cardNumber">XYZ</ns:field> 
     <ns:field ns:name="name">foobar</ns:field> 
     <ns:field ns:name="description">foobar</ns:field> 
     <ns:field ns:name="priority">High</ns:field> 
     <ns:field ns:name="classOfService">Standard Class</ns:field> 
     <ns:field ns:name="cardSize">1</ns:field> 
     <ns:field ns:name="dateIdentified">2017-01-19T04:07:53Z</ns:field> 
     <ns:field ns:name="ExternalCardId">XYZ</ns:field> 
     <ns:field ns:name="currentSwimId">1632088</ns:field> 
     <ns:field ns:name="currentQueueId">2322634</ns:field> 
     </ns:fields> 
    </ns:getCardResponse> 
    </soapenv:Body> 
</soapenv:Envelope> 

WSLD:短いZEEPで

<wsdl:operation name="getCard"> 
    <wsdl:input message="axis2:getCardRequestMessage"> 
</wsdl:input> 
    <wsdl:output message="axis2:getCardResponseMessage"> 
</wsdl:output> 
</wsdl:operation> 
     <xs:element name="getCardRequest"> 
      <xs:complexType> 
       <xs:sequence> 
        <xs:element name="projectId" nillable="false" type="xs:string"/> 
        <xs:element name="cardUniqueId" nillable="false" type="xs:string"/> 
        <xs:element name="cardType" nillable="false" type="xs:string"/> 
        <xs:element name="userLoginId" nillable="true" type="xs:string"/> 
       </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     <xs:element name="getCardResponse"> 
      <xs:complexType> 
       <xs:sequence> 
        <xs:any maxOccurs="unbounded" minOccurs="0"/> 
       </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
    <wsdl:message name="getCardResponseMessage"> 
    <wsdl:part name="part1" element="axis2:getCardResponse"> 
    </wsdl:part> 
    <wsdl:message name="getCardRequestMessage"> 
    <wsdl:part name="part1" element="axis2:getCardRequest"> 
    </wsdl:part> 
    </wsdl:message> 
    <wsdl:message name="getCardResponseMessage"> 
    <wsdl:part name="part1" element="axis2:getCardResponse"> 
    </wsdl:part> 
    </wsdl:message> 
+0

履歴を使用することで、あなたは、このための任意の解決策を見つけたことがありますか?私は同じ問題で苦労している。 – Oliver

答えて

関連する問題