2011-01-18 16 views
15

Używam po raz pierwszy najnowszej wersji suds (https://fedorahosted.org/suds/) i robię się zablokowany w kroku pierwszym.SOAP suds i przerażający schemat Type Not Found błąd

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

Teraz wiem, że to jest dobrze pokryte ziemi w świecie mydlin (https://fedorahosted.org/suds/wiki/TipsAndTricks#Schema-TypeNotFound i Python/Suds: Type not found: 'xs:complexType'), ale wydaje się to nieco inaczej, ponieważ (a) schematu ma być automatycznie związana po wersji 0.3.4 oraz (b) nawet jawnie używając obejścia, to nadal nie działa.

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) 

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

otrzymuje się wyjątek powyżej.

Odpowiedz

11

Mamy to działa i mam nadzieję, że również ci się udało, mimo że jest nieco dziwaczny. Być może pomoże ci jawna lokalizacja lub filtr. Np .:

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

Dziękuję za odpowiedź i jestem pewien, że pomoże to przyszłym ludziom, którzy natkną się na tę kwestię. Niestety, postanowiłem po prostu rozmawiać XML z interfejsem, który jest brzydki, ale zaskakująco trudny do zrobienia. – dpjanes

+0

@dpjanes: Rzeczywiście tak. Trwało to tylko dwa dni, aby ta przeklęta rzecz mogła zadziałać. –

+1

Nie wydaje mi się, żeby to miało jakikolwiek wpływ. Otrzymuję dokładnie ten sam błąd opisany powyżej przed i po wykonaniu importu. Używam najnowszych suds 0.4 – ThatAintWorking

18

Przez chwilę waliłem w głowę. W końcu rozwiązałem problem, stosując następującą składnię:

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) 

Co ważne, zacznij od adresu URL. Otwórz ten plik w przeglądarce i dostarczy ci definicji wsdl. Upewnij się, że masz tu właściwy adres URL i faktycznie otwiera się plik XML. Pamiętaj także o? Wsdl na końcu adresu URL.

Po drugie, imp = Import('http://schemas.xmlsoap.org/soap/encoding/') zaimportuje standardowy schemat SOAP.

Po trzecie, imp.filter.add('http:somedomain.com/A') doda konkretny obszar nazw. Możesz znaleźć tę lokalizację przestrzeni nazw, otwierając URL zdefiniowany powyżej w url= i szukając sekcji <wsdl:import namespace="http://somedomain.com/A".

Należy również pamiętać o http i https w swoich adresach URL.

+1

+1 dla odniesienia do adres URL-a, jest to dość ważne, ponieważ można tam z łatwością ponownie użyć wsdl-url, co nie będzie działało. – asdfsdfsdfsdfsd3232

+0

Czy to dotyczy problemu, z którym się spotykam https://stackoverflow.com/questions/44586989/not- czy można stworzyć filtr mydła w suds? – Hussain

5

Dla tych, którzy nadal są zaniepokojeni tym problemem. Ten link https://bitbucket.org/jurko/suds/issue/20/typenotfound-schema może dostarczyć przydatnych informacji. Rozwiązanie byłoby takie:

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)) 
Powiązane problemy