python suds解析SOAP响应时出错

2024-09-28 18:54:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用脚本从计费系统获取信息(省略IP):

from suds.client import Client

from netaddr import *
import logging

logging.basicConfig(filename='provisionSV.log',format='%(asctime)s %(levelname)s  (message)s',level=logging.INFO)
logging.getLogger('suds.client').setLevel(logging.DEBUG)
logging.getLogger('suds.transport').setLevel(logging.DEBUG)

url = 'http://X.X.X.X:X/services/X?wsdl'
client = Client(url)
resultGet = client.service.getCustomerAllowancesRequestType_Search('myself', 100000000000000, 309999900000001)

在日志中我可以看到请求很好,我得到的响应是:

^{pr2}$

但我在应用程序中遇到一个sax解析异常:

Traceback (most recent call last):
File "/usr/local/lib/python3.4/xml/sax/expatreader.py", line 207, in feed
   self._parser.Parse(data, isFinal)
xml.parsers.expat.ExpatError: syntax error: line 1, column 0

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/root/fciannel/python-project/autheudsessions/venv/lib/python3.4/site-packages/suds/client.py", line 521, in __call__
return client.invoke(args, kwargs)
File "/root/fciannel/python-project/autheudsessions/venv/lib/python3.4/site-packages/suds/client.py", line 581, in invoke
result = self.send(soapenv)
File "/root/fciannel/python-project/autheudsessions/venv/lib/python3.4/site-packages/suds/client.py", line 619, in send
description=tostr(e), original_soapenv=original_soapenv)
File "/root/fciannel/python-project/autheudsessions/venv/lib/python3.4/site-packages/suds/client.py", line 661, in process_reply
replyroot = _parse(reply)
File "/root/fciannel/python-project/autheudsessions/venv/lib/python3.4/site-packages/suds/client.py", line 832, in _parse
return Parser().parse(string=string)
File "/root/fciannel/python-project/autheudsessions/venv/lib/python3.4/site-packages/suds/sax/parser.py", line 133, in parse
sax.parse(source)
File "/usr/local/lib/python3.4/xml/sax/expatreader.py", line 107, in parse
xmlreader.IncrementalParser.parse(self, source)
File "/usr/local/lib/python3.4/xml/sax/xmlreader.py", line 123, in parse
self.feed(buffer)
File "/usr/local/lib/python3.4/xml/sax/expatreader.py", line 211, in feed
self._err_handler.fatalError(exc)
File "/usr/local/lib/python3.4/xml/sax/handler.py", line 38, in fatalError
raise exception xml.sax._exceptions.SAXParseException: 
<unknown>:1:0: syntax error

我得到的答案怎么了?在


Tags: inpyprojectclientparselibloggingline
2条回答

多谢了,这个成功了,我写了一个插件,删除了MIME部分。这是一个简单的例子:

class MyPlugin(MessagePlugin):
    def received(self, context):
        answer = context.reply
        answerDecoded = answer.decode()
        xmlMessage = re.search(r'(<soapenv\:Envelope.*)\r', answerDecoded)
        replyFinal = xmlMessage.group(1)+'\n'
        replyFinalDecoded = replyFinal.encode()
        context.reply = replyFinalDecoded

到目前为止一切似乎都很好。在

非常感谢你的提示!在

好吧,HTTP响应主体不是格式良好的XML,因为它被包装在MIME/multipart结构中。据我所知,suds不支持“multipart/related”内容类型的响应。我认为在将回复传递给XML解析器之前,您必须自己反汇编它。在

我认为解决这个问题的最好方法可能是编写一个自定义的MessagePlugin并实现received(context)方法(实际的回复是上下文的一部分)。在

相关问题 更多 >