获取unmarshalling Error: For input string: ""
。这可能意味着wsdl无法反序列化数据。但我的xml格式正确。为什么wsdl服务会在这个xml上窒息?
我正在使用Suds + python。 这是肥皂服务的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"
和key
没有添加su value
吗?如果是,那么如何添加它?
答案 0 :(得分:1)
我使用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()])
通过这种方式,您可以根据您作为条目传递的密钥进行控制,您可以正确设置类型。