SUDS消耗SOAP服务的文件头上的SAXParseException - 如何正确使用soap?

时间:2014-01-22 10:57:49

标签: parsing python-2.7 soap suds

使用Python 2.7.5和suds == 0.4

的mac

我正在使用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)

我将客户端设置为返回xml而不将其解析为python对象:

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

我发现这是返回并被解析的字符串。在suds中,您可以注入一条消息来测试您的回复:

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

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

所以我扔了没有uuid和Content头的XML字符串,它解析得很好。但是我试图弄乱uuid,比如从它中删除+ id并且它不会解析。这是我迷路的地方。我不认为我有编码问题。我假设解析错误是由xml文件的标头引起的。

当我请求原始xml时,我认为这些标题是正常的吗?

那个uuid中的+符号是否失败?如果是这样,为什么呢?

如何使用肥皂水解析?或者我应该尝试另一个图书馆吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

当suds使用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]"

数据

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

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内容。

我希望这会对你有所帮助。