2014-01-22 80 views
3

在Python 2.7.5中使用mac和suds == 0.4SUDS使用SOAP服務的文件頭上的SAXParseException - 如何正確使用soap?

我使用suds(第一次)使用wsdl來使用soap web服務。當我請求XML raw時,我對這個響應感到困惑,因爲它無法解析。

from suds.client import Client 
from datetime import datetime 

client = Client('http://domeintabellen-idsw-ws.rws.nl/DomainTableWS.svc?wsdl') 
request = client.factory.create('ns1:GetDomainTableNamesRequest') 
today = datetime.today() 
request.CheckDate = today 
result = client.service['basic'].GetDomainTableNames(request) 

這給了我一個錯誤:

SAXParseException: <unknown>:2:43: not well-formed (invalid token) 

我設置了客戶端沒有它解析爲Python對象返回XML:

client.set_options(retxml=True) 

,我收到了回報,我可以手動解析。不過,我希望「它」能夠正常工作,並且更好地理解問題所在。

返回的XML如下所示,似乎包含一些標頭。我注意到uuid中的+ id在每次請求後都被提出。

--uuid:1d4b4778-364c-4743-8eb3-d72a1e3f7747+id=28 
Content-ID: <http://tempuri.org/0> 
Content-Transfer-Encoding: 8bit 
Content-Type: application/xop+xml;charset=utf-8;type="text/xml" 

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><GetDomainTableNamesResponse xmlns="http://rws.services.nl/DomainTableWS/2010/10"><GetDomainTableNamesResult xmlns:a="http://rws.services.nl/DomainTableWS/Contracts/2010/10" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><a:DomainTableNames><a:string>Aanduiding_naamgebruik</a:string><a:string>Aanslag_type</a:string><a:string>Aanvoereenheid_soorten</a:string><a:string>Aanvoergebied_soorten</a:string><a:string>Aanwezig_afwezig_onbekend</a:string><a:string>Academische_titel</a:string><a:string>Adellijke_titel_of_predikaat</a:string><a:string>Afleveringspunt_soorten</a:string><a:string>Afsluitwijzen</a:string><a:string>Afvoergebied_soorten</a:string><a:string>Afwateringseenheid_soorten</a:string><a:string>AtRisktype</a:string><a:string>BBP_beheerproduct</a:string><a:string>BBP_beleidsproduct</a:string><a:string>Bedrijfstakken_WVOW</a:string><a:string>Beheersvormen_waterkering</a:string><a:string>Belastingsoorten</a:string><a:string>Bemalen_of_vrij_verval</a:string><a:string>Bemonsteringsapparaat</a:string><a:string>Bemonsteringsmethode</a:string><a:string>Bemonsteringssoort</a:string><a:string>Beoordeling_schade</a:string><a:string>BeschermdGebiedtype</a:string><a:string>Bestemmingen_afvalwater</a:string><a:string>Besturingswijze</a:string><a:string>Bevaarbaarheidsklassen</a:string><a:string>BevoegdGezagSoort</a:string><a:string>Beweegbare_bruggen</a:string><a:string>Biotaxon</a:string><a:string>Boomhoogte</a:string><a:string>Brander</a:string><a:string>CEFILT</a:string><a:string>ClassificatieCIW</a:string><a:string>ClassificatieKRWGW</a:string><a:string>ClassificatieKRWbiologischOW</a:string><a:string>ClassificatieKRWchemischOW</a:string><a:string>Code_stroomrichting</a:string><a:string>Code_sturing</a:string><a:string>Compartiment</a:string><a:string>Correspondentie_soorten</a:string><a:string>Detailonderdeel_bijzondere_weglaag</a:string><a:string>Detailplaats_lijnmarkering</a:string><a:string>DoelMeetLocatieType</a:string><a:string>Doelen_baggerwerkzaamheden</a:string><a:string>Doelen_voor_metingen</a:string><a:string>Doorspoelbaarheid</a:string><a:string>Drainerende_werking</a:string><a:string>Druk</a:string><a:string>Drukklassen</a:string><a:string>EBEOkarakteristiek</a:string><a:string>EUfonds</a:string><a:string>Ecologische_verbindingszone_soort</a:string><a:string>Eenheden_voor_precario</a:string><a:string>Eenheid</a:string><a:string>Effecttype</a:string><a:string>Eindbeeld_boomvakdeel</a:string><a:string>Eindbestemmingen_baggerspecie</a:string><a:string>EmissieBrontype</a:string><a:string>Energielevering_soorten</a:string><a:string>FunctieKunstwerk</a:string><a:string>Functies_van_adressen</a:string><a:string>Functies_vastgoedelementen_en_gebieden</a:string><a:string>Gebouwd_onbebouwd</a:string><a:string>Gebruikscodes_objecten</a:string><a:string>Geografische_schalen</a:string><a:string>Graderingen_filterlaag</a:string><a:string>Gras_beheervorm</a:string><a:string>Gras_soorten</a:string><a:string>Groenbeheerniveau</a:string><a:string>Groentype</a:string><a:string>Grondmechanische_aspect_soorten</a:string><a:string>Grondslagen</a:string><a:string>Grootheid_dummy</a:string><a:string>Heffingsobject_soorten</a:string><a:string>Hoedanigheid</a:string><a:string>IWSRindicator</a:string><a:string>Inrichtingtype</a:string><a:string>J_N_of_onbekend</a:string><a:string>J_of_N</a:string><a:string>KRWKwaliteitselement</a:string><a:string>KRWMaatregelGebiedsniveau</a:string><a:string>KRWMaatregeltype</a:string><a:string>KRWMeetLocatietype</a:string><a:string>KRWStatus</a:string><a:string>KRWStroomgebiedsdistrict</a:string><a:string>KRWWatertype</a:string><a:string>KRWhydromorfologische_parameter</a:string><a:string>Kabel_en_leiding_soorten</a:string><a:string>Koppelstuk_soorten</a:string><a:string>Kunstwerktype</a:string><a:string>Kwaliteitsoordeel</a:string><a:string>L_R_B</a:string><a:string>Leidingdeel_soorten</a:string><a:string>LocatietypeWaardeBepaling</a:string><a:string>Lozingsvoorziening_soorten</a:string><a:string>Materialen_voor_afvalwatertransportwerken</a:string><a:string>Materialen_voor_bekleding_waterkering_of_profiel</a:string><a:string>Materialen_voor_kunstwerken</a:string><a:string>Materialen_voor_leidingen</a:string><a:string>Materialen_voor_profielverdedigingen</a:string><a:string>Meetapparaat</a:string><a:string>Meetinstantie</a:string><a:string>Meting</a:string><a:string>Monsterbewerkingsmethode</a:string><a:string>Normgroep</a:string><a:string>Normkader</a:string><a:string>NoseCodetype</a:string><a:string>Onderzoekssoort</a:string><a:string>Onttrekkingsvoorziening_soorten</a:string><a:string>Onttrekkingtype</a:string><a:string>Opmerking_weglaag</a:string><a:string>OppervlakteCategorieStoomgebiedtype</a:string><a:string>Orgaan</a:string><a:string>Overige_vastgoedelement_soorten</a:string><a:string>Parameter</a:string><a:string>Plaatsbepalingsapparaat</a:string><a:string>Processen_RWZI</a:string><a:string>Processen_SVI</a:string><a:string>Processen_transportstelsel</a:string><a:string>Profiellijn_soorten</a:string><a:string>RWZI_soorten</a:string><a:string>Rechtsvormen_bedrijf</a:string><a:string>RedenGebruikLocatie</a:string><a:string>RichtlijnType</a:string><a:string>Rioleringselementen</a:string><a:string>Rioolstelsel_soorten</a:string><a:string>SGBPTitel</a:string><a:string>Scheepvaartteken</a:string><a:string>Soort_zorgplicht_voor_bomen</a:string><a:string>Staat</a:string><a:string>Stuw_soorten</a:string><a:string>Subject_rollen</a:string><a:string>Substraattype</a:string><a:string>TijdDimensietype</a:string><a:string>Tijdelijke_kroon</a:string><a:string>Vaarweg_soorten</a:string><a:string>Veer_typen</a:string><a:string>Verkeersvoorziening_boomvakdeel</a:string><a:string>Vormen</a:string><a:string>Waardebepalingsmethode</a:string><a:string>Waardebepalingstechniek</a:string><a:string>Waardebewerkingsmethode</a:string><a:string>Waarnemingssoort</a:string><a:string>WaterTypeKwantitatief</a:string><a:string>Waterbeheerder</a:string><a:string>Waterbeheergebiedtype</a:string><a:string>Waterkeringtype</a:string><a:string>Waterrijkheidtype</a:string><a:string>Waterstaatkundigezonering</a:string><a:string>WatertypeKwalitatief</a:string><a:string>WegAardtype</a:string><a:string>WetVerordeningtype</a:string><a:string>Zuivering_soorten</a:string><a:string>ZwemplekVoorzieningen</a:string></a:DomainTableNames></GetDomainTableNamesResult></GetDomainTableNamesResponse></s:Body></s:Envelope> 

--uuid:1d4b4778-364c-4743-8eb3-d72a1e3f7747+id=28-- 

我想通了這是返回並被解析的字符串。在泡你可以注入一個消息來測試你的反應:

response = \ 
"""<enter message here>"""" 

result = client.service['basic'].GetDomainTableNames(__inject={'reply':response}) 

所以我不扔的uuid和內容標題中的XML字符串,並將其解析就好了。然而,我試圖搞亂uuid,就像從中刪除+ id一樣,它不會解析。這是我迷路的地方。我不認爲我有編碼問題。我假設解析錯誤是由xml文件的標題引起的。

我認爲這些標頭是正常的,當我請求原始XML?

它在uuid中的+符號上失敗嗎?如果是的話,爲什麼?

如何使用泡沫來解析它?或者我應該嘗試其他圖書館?

謝謝!

+0

我也用soapui試過了。但是找不到錯誤。但有一個問題,有像'xmlns =「http://rws.services.nl/DomainTableWS/2010/10」'的網址。我不知道是否有必要,但主持人是未知的。 –

+0

我其實也嘗試了soapui這個週末,但沒有更新的問題呢。 soapui沒有錯誤。隨着pysimplesoap錯誤也會發生。 – Klodder

回答

2

當泡沫使用的urllib2獲取HTTP頭正確

集管

Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "HTTP/1.0 200 OK[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "Date: Wed, 29 Jan 2014 12:19:17 GMT[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "Server: Microsoft-IIS/6.0[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "Set-Cookie: BALANCEID=nwr-iavw-dnt1.node1;path=/;[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "X-Powered-By: ASP.NET[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "X-AspNet-Version: 2.0.50727[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "Mime-Version: 1.0[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "Cache-Control: private[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "Content-Type: multipart/related; type="application/xop+xml";start="<http://tempuri.org/0>";boundary="uuid:49c70d41-cde8-4e80-9834-23051887a718+id=6";start-info="text/xml"[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "X-Cache: MISS from ...[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "X-Cache-Lookup: MISS from ...:8128[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "Via: 1.1 ...:8128 (squid/x.x.STABLE3)[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "Connection: close[\r][\n]" 

的數據Data

Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "--uuid:49c70d41-cde8-4e80-9834-23051887a718+id=6[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "Content-ID: <http://tempuri.org/0>[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "Content-Transfer-Encoding: 8bit[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "Content-Type: application/xop+xml;charset=utf-8;type="text/xml"[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><GetDomainTableNamesResponse xmlns="http://rws.services.nl/DomainTableWS/2010/10"><GetDomainTableNamesResult xmlns:a="http://rws.services.nl/DomainTableWS/Contracts/2010/10" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">...</GetDomainTableNamesResponse></s:Body></s:Envelope>[\r][\n]" 
Wed Jan 29 13:19:15 CET 2014:DEBUG:<< "--uuid:49c70d41-cde8-4e80-9834-23051887a718+id=6--[\r][\n]" 

看起來像服務器返回與所述的響應數據SOAP消息和其他東西(--uuid等)

SOAPUI可能工作原因是因爲再次解析僅查找消息的響應數據(或Apache HTTPClient按預期處理響應),但似乎suds在sud的Binding類的replyfilter(第58行)中存在問題,suds解釋有效響應是從Urllib2返回的所有數據,並且不會再次解析消息。

replyfilter = (lambda s,r: r) 

... 

    reply = self.replyfilter(reply) 

suds 0。4實現了一個插件工具,這樣你就可以使用MessagePlugin再次分析數據的只得到消息,一個簡單的例子

import logging 
from suds.client import Client 
from datetime import datetime 
from suds.plugin import MessagePlugin 

class Filter(MessagePlugin): 
    def received(self, context): 
     reply = context.reply 
     context.reply = reply[reply.find("<s:Envelope"):reply.rfind(">")+1] 

logging.basicConfig(level=logging.INFO) 
logging.getLogger('suds.transport').setLevel(logging.DEBUG) 

client = Client('http://domeintabellen-idsw-ws.rws.nl/DomainTableWS.svc?wsdl', plugins=[Filter()]) 
request = client.factory.create('ns1:GetDomainTableNamesRequest') 
today = datetime.today() 
request.CheckDate = today 
result = client.service['basic'].GetDomainTableNames(request) 

我不是一個Python的專家,您可以在一個簡單的方法使用正則表達式太獲取消息並覆蓋context.reply內容。

我希望這可以幫助你。

+0

嘿謝謝你的回答。我沒有時間親自嘗試,但是這週末會這樣做。 – Klodder