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

标签 python suds

获取 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 添加到 keyvalue 吗?如果是那么如何添加呢?

最佳答案

我使用 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/

相关文章:

python - Pycharm 的终端不会更改 Project Interpreter 处的 Python 版本对应的 Python 版本

python - Mac 上的 Visual Studio Code 中未出现 Matplotlib 图像

python - 导入命名空间后出现 TypeNotFoundError

python - "<faultcode/> not mapped to message part"的泡沫是什么意思?

python - Suds + JIRA = SAXException

python - 处理 Python 中其他库导入的库异常的最佳实践?

python - 在 Python 中进行位域操作的最佳方法是什么?

javascript - django模板-日期格式问题

python - Tkinter 中指定的 Canvas 单位是什么?

使用 soaplib(服务器)和 suds(客户端)的 Python soap