Suds无法解析新的WSDL文件
我有一个Python脚本,它通过SOAP接口和一些第三方软件进行交互,使用的是suds 0.4.1-3.el6这个库。
之前一切都运行得很好,直到最近软件更新了。现在所有类似下面的脚本:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
#
import logging
from suds import WebFault
from suds.client import Client
logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.client').setLevel(logging.DEBUG)
client = Client("http://localhost:80/admin/soap/api3.wsdl")
#print client.location
#client.location = 'http://localhost:34012/'
print client
都出现了以下问题:
Traceback (most recent call last):
File "print.py", line 18, in <module>
client = Client("http://localhost:80/admin/soap/api3.wsdl")
File "/usr/lib/python2.6/site-packages/suds/client.py", line 119, in __init__
sd = ServiceDefinition(self.wsdl, s)
File "/usr/lib/python2.6/site-packages/suds/servicedefinition.py", line 58, in __init__
self.paramtypes()
File "/usr/lib/python2.6/site-packages/suds/servicedefinition.py", line 137, in paramtypes
item = (pd[1], pd[1].resolve())
File "/usr/lib/python2.6/site-packages/suds/xsd/sxbasic.py", line 63, in resolve
raise TypeNotFound(qref)
suds.TypeNotFound: Type not found: '(soapDiscountAddons, http://www.w3.org/2001/XMLSchema, )'
软件的支持团队说:“我们的WSDL文件没问题,去问suds的开发者。”所以我需要帮助来调查这个问题。
之前能正常工作的文件:
https://dl.dropbox.com/u/4299326/py/20130225.wsdl/old/api3.wsdl
https://dl.dropbox.com/u/4299326/py/20130225.wsdl/old/encoding.xml
现在出错的文件:
https://dl.dropbox.com/u/4299326/py/20130225.wsdl/new/api3.wsdl
https://dl.dropbox.com/u/4299326/py/20130225.wsdl/new/encoding.xml
1 个回答
软件支持团队说:“我们的WSDL文件没问题,去问suds的开发者。”
我觉得这不太对。suds显示的找不到类型: '(soapDiscountAddons, http://www.w3.org/2001/XMLSchema, )'
这个信息是正确的。
从你的WSDL文件来看,soapDiscountAddons
是在urn:api3
这个命名空间下,所以你在使用的时候需要提到这个命名空间。问题出在这里:
<!-- operation response element -->
<element name="getDiscountAddonsResponse">
<complexType>
<sequence>
<element name="ret" type="soapDiscountAddons" minOccurs="1" maxOccurs="unbounded"/>
</sequence>
</complexType>
</element>
<!-- operation request element -->
<element name="insupdDiscountAddon">
<complexType>
<sequence>
<element name="val" type="soapDiscountAddons" minOccurs="1" maxOccurs="1"/>
</sequence>
</complexType>
</element>
因为你没有加上前缀,系统使用了当前的命名空间http://www.w3.org/2001/XMLSchema
,而不是urn:api3
。所以suds试图去找soapDiscountAddons@http://www.w3.org/2001/XMLSchema
这个元素,但实际上它应该去找soapDiscountAddons@urn:api3
,而这个元素根本不存在。
这样修改应该就能解决问题:
<element name="getDiscountAddonsResponse">
<complexType>
<sequence>
<element name="ret" type="lbapi:soapDiscountAddons" minOccurs="1" maxOccurs="unbounded"/>
<!-- ^^^^^ you are missing this -->
</sequence>
</complexType>
</element>
<!-- operation request element -->
<element name="insupdDiscountAddon">
<complexType>
<sequence>
<element name="val" type="lbapi:soapDiscountAddons" minOccurs="1" maxOccurs="1"/>
<!-- ^^^^^ you are missing this -->
</sequence>
</complexType>
</element>