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