SOAP suds и ужасная схема Тип Не найдена ошибка

Я использую последнюю версию suds (https://fedorahosted.org/suds/) в первый раз, и я застопорился на первом шаге,

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

Теперь я знаю, что это хорошо освещенная земля в мире пены (https://fedorahosted.org/suds/wiki/TipsAndTricks#Schema-TypeNotFound и Python/Suds: Тип не найден: 'xs: complexType'), но это выглядит несколько иначе, потому что (а) схема должна автоматически привязываться после версии 0.3.4 и (б) даже явно использовать обходной путь, он все равно не работает.

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)

с 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>

дает исключение выше.

Ответы

Ответ 1

Мы получили его работу, и я надеюсь, что и вы это сделали, хотя это немного причудливо. Возможно, поможет явное местоположение или фильтр. Например:.

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

Ответ 2

Я некоторое время стучал головой об этом. Я, наконец, решил проблему, используя следующий синтаксис:

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)

Важно, начните с URL. Откройте этот файл в своем браузере, и он предоставит вам определения wsdl. Убедитесь, что у вас есть правильный url, введенный здесь, и что фактически открывается XML файл. Также обратите внимание на? Wsdl в конце URL-адреса.

Во-вторых, imp = Import('http://schemas.xmlsoap.org/soap/encoding/') импортирует стандартную схему SOAP.

В-третьих, imp.filter.add('http:somedomain.com/A') добавит ваше конкретное пространство имен. Вы можете найти это пространство имен, открыв URL-адрес, указанный выше в url=, и найдите раздел <wsdl:import namespace="http://somedomain.com/A".

Также обратите внимание на http vs https в своих URL-адресах.

Ответ 3

Для тех, кто все еще обеспокоен этой проблемой. Эта ссылка https://bitbucket.org/jurko/suds/issue/20/typenotfound-schema может предоставить полезную информацию. Решение будет таким:

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