获取 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>
我继续收到解码错误
。这是因为 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()])
通过这种方式,您可以根据作为条目传递的键进行控制,您可以正确设置类型。
关于python - 解码错误 : For input string: "",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8211783/