解组错误:对于输入字符串:“”

2024-10-01 17:38:14 发布

您现在位置:Python中文网/ 问答频道 /正文

正在获取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代码:

^{pr2}$

由suds创建的XML消息:

<query>
   <parameters>
      <entry>
         <key>*:*</key>
         <value>*:*</value>
      </entry>
   </parameters>
</query>

我继续得到unmarshalling Error。这是因为xsi:type="ns0:string"不是由泡沫添加到key和{}?如果是,那么如何添加?在


Tags: keynamestringvaluetypeerrorelementwsdl
1条回答
网友
1楼 · 发布于 2024-10-01 17:38:14

我用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()])

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

相关问题 更多 >

    热门问题