Skip to main content
 首页 » 编程设计

python之解码错误 : For input string: ""

2025年05月04日11jpfss

获取 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()]) 

通过这种方式,您可以根据作为条目传递的键进行控制,您可以正确设置类型。