正在获取unmarshalling Error: For input string: ""
。这可能意味着wsdl无法反序列化数据。但是我的xml格式正确。为什么wsdl服务在此xml上令人窒息?
我正在使用Suds + python。
这是soap服务的wsdl:
<xs:element name="parameters">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" name="entry">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="key" type="xs:string"/>
<xs:element minOccurs="0" name="value" type="xs:anyType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
Python代码:
client = Client(url)
query = client.factory.create('query')
listval1 = {"key":"*:*","value":"*:*"}
query.parameters.entry = [listval1]
response = client.service.search(query)
suds创建的XML消息:
<query>
<parameters>
<entry>
<key>*:*</key>
<value>*:*</value>
</entry>
</parameters>
</query>
我继续得到
unmarshalling Error
。这是因为xsi:type="ns0:string"
不是由suds添加到key
和value
的吗?如果是,那么如何添加呢? 最佳答案
我使用a MessagePlugin概念解决了这个问题。
from suds.client import Client
from suds.plugin import MessagePlugin
class AnyTypePlugin(MessagePlugin):
mapping = {
'id': 'xsd:int',
'title': 'xsd:string',
}
def marshalled(self, context):
modified = False
body = context.envelope.getChild('Body')
query = body.getChild("query")
if query:
params = query.getChild("parameters")
if params:
entries = params.getChildren("entry")
if entries:
for entry in entries:
key = entry.getChild("key").getText()
if key in self.mapping:
attr = Attribute('xsi:type', self.mapping[key])
entry.getChild("value").append(attr)
modified = True
if modified:
xsd_attr = Attribute('xmlns:xsd', 'http://www.w3.org/2001/XMLSchema')
context.envelope.append(xsd_attr)
url = "some wsdl url"
client = Client(url, plugins=[AnyTypePlugin()])
这样,您可以根据输入的密钥来进行控制,从而可以正确设置类型。