SOAP suds and the dreaded schema Type Not Found error
Asked Answered
M

3

15

I'm using the latest version of suds (https://fedorahosted.org/suds/) for the first time and I'm getting stalled at step one.

suds.TypeNotFound: Type not found: '(schema, http://www.w3.org/2001/XMLSchema, )'

Now, I know this is well covered ground in the suds world (https://fedorahosted.org/suds/wiki/TipsAndTricks#Schema-TypeNotFound and Python/Suds: Type not found: 'xs:complexType') but this appears to slightly different because (a) schema is supposed to be automatically bound after version 0.3.4 and (b) even explicitly using the workaround, it still doesn't work.

from suds.client import Client
from suds.xsd.sxbasic import Import

url = 'file:wsdl.wsdl'
Import.bind('http://schemas.xmlsoap.org/soap/encoding/')
client = Client(url, cache = None)

with the wsdl:

<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
xmlns:tns="http://ws.client.com/Members.asmx"
xmlns:s="http://www.w3.org/2001/XMLSchema"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
targetNamespace="http://ws.client.com/Members.asmx"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
  <wsdl:types>
    <s:schema elementFormDefault="qualified" targetNamespace="http://ws.client.com/Members.asmx">

      <s:element name="GetCategoriesResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="GetCategoriesResult">
              <s:complexType>
                <s:sequence>
                  <s:element ref="s:schema" />
                  <s:any />
                </s:sequence>
              </s:complexType>
            </s:element>
          </s:sequence>
        </s:complexType>
      </s:element>

    </s:schema>
  </wsdl:types>
</wsdl:definitions>

yields the exception above.

Manhour answered 18/1, 2011 at 2:6 Comment(0)
C
11

We got it working and I hope you did as well, even though it is a bit quirky. Perhaps an explicit location or filter will help. E.g.:

imp = Import(
    'http://schemas.xmlsoap.org/soap/encoding/',
    location='http://schemas.xmlsoap.org/soap/encoding/'
)
imp.filter.add('http://ws.client.com/Members.asmx')
client = Client(url, plugins=[ImportDoctor(imp)])
Counterpart answered 11/5, 2011 at 18:59 Comment(4)
Thank you for the answer and I'm sure it will help future people who come across this issue. Alas, I decided to just talk XML to the interface which is ugly but surprisingly undifficult to do.Manhour
@dpjanes: Indeed it did. Only took two days to get this blasted thing to work.Clover
This doesn't seem to have any affect at all for me. I get the exact same error described above before and after doing the import. I am using the latest suds 0.4Hyohyoid
Does this apply to my problem #44587489Revivalist
W
19

I was banging my head for a while on this one. I finally resolved the issue by using the following syntax:

from suds.xsd.doctor import ImportDoctor, Import

url = 'http://somedomain.com/filename.php?wsdl'
imp = Import('http://schemas.xmlsoap.org/soap/encoding/')
imp.filter.add('http://some/namespace/A')
doctor = ImportDoctor(imp)

client = Client(url, doctor=doctor)

Importantly, start with the url. Open that file in your browser and it will provide you with the wsdl definitions. Make sure you have the right url entered here and that an XML file actually opens. Also mind the ?wsdl at the end of the url.

Second, imp = Import('http://schemas.xmlsoap.org/soap/encoding/') will import the standard SOAP schema.

Third, imp.filter.add('http:somedomain.com/A') will add your specific namespace. You can find this namespace location by opening the url you defined above in url=and looking for the section <wsdl:import namespace="http://somedomain.com/A".

Also be mindful of http vs https in your urls.

Widener answered 22/5, 2013 at 3:27 Comment(3)
+1 for the reference to the namespace-url, this is actually quite important, as you could easily reuse the wsdl-url there, which will do nothingGerdagerdeen
Is this applicable to a problem I am facing #44587489 ?Revivalist
And what do you use if your XML does not have the <wsdl:import namespace="http://something/">? As mine does not.Automaton
C
11

We got it working and I hope you did as well, even though it is a bit quirky. Perhaps an explicit location or filter will help. E.g.:

imp = Import(
    'http://schemas.xmlsoap.org/soap/encoding/',
    location='http://schemas.xmlsoap.org/soap/encoding/'
)
imp.filter.add('http://ws.client.com/Members.asmx')
client = Client(url, plugins=[ImportDoctor(imp)])
Counterpart answered 11/5, 2011 at 18:59 Comment(4)
Thank you for the answer and I'm sure it will help future people who come across this issue. Alas, I decided to just talk XML to the interface which is ugly but surprisingly undifficult to do.Manhour
@dpjanes: Indeed it did. Only took two days to get this blasted thing to work.Clover
This doesn't seem to have any affect at all for me. I get the exact same error described above before and after doing the import. I am using the latest suds 0.4Hyohyoid
Does this apply to my problem #44587489Revivalist
K
7

For those who still is troubled by this problem. This link https://bitbucket.org/jurko/suds/issue/20/typenotfound-schema may provide useful information. The solution would be like this:

from suds.client import Client
from suds.xsd.doctor import Import, ImportDoctor

url = 'http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl'
imp = Import('http://www.w3.org/2001/XMLSchema',
    location='http://www.w3.org/2001/XMLSchema.xsd')
imp.filter.add('http://WebXml.com.cn/')
client = Client(url, doctor=ImportDoctor(imp))
Kelula answered 10/4, 2015 at 6:2 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.