我正在尝试使用suds为django获取WSDL响应。但是我无缘无故地得到了一个未找到类型的错误。
Type not found: 'ProfileInfo'
这就是我的xml应该是这样的:
<Profiles>
<ProfileInfo>
<Profile ProfileType="1">
<Customer>
</Customer>
</Profile>
</ProfileInfo>
</Profiles>
suds客户端为我提供了2个对象:
ns0:ProfileType
ns0:ProfilesType
没有ProfileInfo对象。
这就是我的意思: 我创建了一个ProfilesType对象:
profiles = client.factory.create('ns0:ProfilesType')
此对象如下所示:
(ProfilesType){
ProfileInfo[] = <empty>
}
由于我没有可以创建的ProfileInfo对象,我尝试了两种方法: 1.将ProfileType对象附加到ProfileInfo
profile = client.factory.create('ns0:ProfileType')
profiles.ProfileInfo.append(profile)
这会生成以下XML,服务器会拒绝该
<Profiles>
<ProfileInfo>
<Customer>
</Customer>
</ProfileInfo>
</Profiles>
2 ..创建一个虚拟的profileinfo对象并向其添加profiletype:
profile_info = {"ProfileInfo": []}
profile_info["ProfileInfo"].append(profile)
profiles.ProfileInfo.append(profile_info)
这会引发错误“Type not found:'ProfileInfo'”
我该怎么办?我一直在尝试各种组合,但似乎没有任何效果。
答案 0 :(得分:0)
我将尝试泡沫医生,可能会有所帮助,请参阅:Suds: Type not found on response
这个回答让我走上正轨。进口医生没有工作,但这样做了:
https://fedorahosted.org/suds/wiki/Documentation#FIXINGBROKENSCHEMAs
我打开了架构,看看缺少的类型所指的位置,并找到了一个命名空间和位置,这里填写了这个:
from suds.xsd.sxbasic import Import
ns = '<fill in the namespace for the missing type>'
schema_url = '<fill in the url>'
Import.bind(ns, location)
# repeat this for all missing types
# and than create the client
client = Client(wsdl_url)
message= '%s' % client
# log the message, and this works for me!
答案 1 :(得分:0)
我必须创建一个虚拟的ProfileInfo对象。
profile_info = {"Profile": []}
profile_info["Profile"].append(profile)
profiles = client.factory.create('ns0:ProfilesType')
profiles.ProfileInfo.append(profile_info)