Suds无法解析新的WSDL文件

0 投票
1 回答
1117 浏览
提问于 2025-04-17 17:01

我有一个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 个回答

3

软件支持团队说:“我们的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>

撰写回答