我收到的客戶端以下錯誤,當我通過無效XML字符爲Python SimpleXMLRPCServer:無效的Unicode/XML與Python SimpleXMLRPCServer?
Fault: <Fault 1: "<class 'xml.parsers.expat.ExpatError'>:not well-formed (invalid token): line 6, column 15">
爲什麼?我是否必須更改SimpleXMLRPCServer庫代碼才能解決此問題?
這裏是我的XML-RPC服務器代碼:
from SimpleXMLRPCServer import SimpleXMLRPCServer
import logging
logging.basicConfig(level=logging.DEBUG)
def tt(text):
return "cool"
server = SimpleXMLRPCServer(("0.0.0.0", 9000))
server.register_introspection_functions()
server.register_function(tt)
# Run the server's main loop
server.serve_forever()
這裏是我的XML-RPC客戶端代碼:
s = xmlrpclib.ServerProxy('http://localhost:9000')
s.tt(unichr(0x8))
在服務器端,我沒有得到任何錯誤或追溯:
liXXXXXX.members.linode.com - - [06/Dec/2010 23:19:40] "POST /RPC2 HTTP/1.0" 200 -
爲什麼服務器端沒有錯誤?我如何診斷正在發生的事情?
我也得到在客戶端以下回溯:
/usr/lib/python2.6/xmlrpclib.pyc in __call__(self, *args)
1197 return _Method(self.__send, "%s.%s" % (self.__name, name))
1198 def __call__(self, *args):
-> 1199 return self.__send(self.__name, args)
1200
1201 ##
/usr/lib/python2.6/xmlrpclib.pyc in __request(self, methodname, params)
1487 self.__handler,
1488 request,
-> 1489 verbose=self.__verbose
1490 )
1491
/usr/lib/python2.6/xmlrpclib.pyc in request(self, host, handler, request_body, verbose)
1251 sock = None
1252
-> 1253 return self._parse_response(h.getfile(), sock)
1254
1255 ##
/usr/lib/python2.6/xmlrpclib.pyc in _parse_response(self, file, sock)
1390 p.close()
1391
-> 1392 return u.close()
1393
1394 ##
/usr/lib/python2.6/xmlrpclib.pyc in close(self)
836 raise ResponseError()
837 if self._type == "fault":
--> 838 raise Fault(**self._stack[0])
839 return tuple(self._stack)
840
Fault: <Fault 1: "<class 'xml.parsers.expat.ExpatError'>:not well-formed (invalid token): line 6, column 15">
我如何理智服務器端的處理,如果輸入包含無效的XML? 我可以清理這個數據服務器端嗎?怎麼樣?
所以是的,謝謝你的調查。正如我所表明的,我明白這不是有效的XML。我希望能夠捕獲錯誤服務器端(而不是靜默失敗),然後去除輸入中的任何無效字符。我不寫客戶端,如果他們通過我有一個或兩個無效字符的XML,我想爲客戶提供最好的部分結果。 – 2010-12-14 06:30:52