2011-11-21 17 views
1

獲取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) 

XML消息:

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

我繼續得到unmarshalling Error。這是因爲xsi:type="ns0:string"不是通過泡沫添加到keyvalue?如果是,那麼如何添加它?

+2

您將問題標記爲Python,但您尚未提供任何您正在使用的Python代碼。這可能有助於解決您的問題。 –

+0

@ michael-mior添加了Python代碼和錯誤。 – jerrymouse

+1

傑裏,除非你在你的問題中加入可測試的代碼,否則恐怕不可能給你適當的反饋。你發佈的代碼可能真的是任何東西。沒有跡象表明你正在使用什麼庫,沒有提示什麼對象是什麼,等等...... – mac

回答

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

這樣你可以控制取決於你作爲一個條目傳遞什麼鍵,你可以正確設置類型。

相關問題