几天来,我一直在解决这个问题上遇到困难,在互联网上找不到任何有用的资源,所以我将分享我在这个问题上的发现,供以后参考:
Python2.7 xmlrpclib客户端具有XMLRPC标准内置定义的类型,以及一些常见的扩展。但是,其他XMLRPC服务器,例如Apache,有时会使用它们自己的类型,或者将扩展放在特殊的名称空间中,等等。
例如,当您用Apache发送一个8字节整数时( XMLRPC标准未涵盖),它将发送以下响应:
<methodResponse xmlns:ex="http://ws.apache.org/xmlrpc/namespaces/extensions">
<params>
<param>
<value>
<ex:i8>123456789</ex:i8>
</value>
</param>
</params>
</methodResponse>如果您天真地尝试用Python处理这些类型,您将得到一个空的元组结果。如何调整xmlrpclib以处理此类案件?
发布于 2013-09-18 10:52:37
在内部,xmlrpclib使用xmlrpclib.Unmarshaller来分派响应。Unmarshaller有一个dispatch字典,其中为每个类型分配了一个函数来处理它。
让问题的示例工作起来其实很容易,因为xmlrpclib已经可以处理i8了,我们只需将ex:i8重新映射到:
xmlrpclib.Unmarshaller.dispatch['ex:i8'] = xmlrpclib.Unmarshaller.dispatch['i8']但是对于更多的自定义类型,可能需要编写分派函数。它们被设计为在Unmarshaller中定义,因此一个典型的调度函数如下所示:
def end_int(self, data):
self.append(int(data))
self._value = 0
dispatch['i8'] = end_int_value = 0只是表示调度成功。所以如果我们有
<methodResponse>
<params>
<param>
<value>
<mycustom>some value</mycustom>
</value>
</param>
</params>
</methodResponse>我们可以界定:
def mycustom_parser(unmarshaller, data):
unmarshaller.append(data.split())
unmarshaller._value = 0
xmlrpclib.Unmarshaller.dispatch['mycustom'] = mycustom_parserhttps://stackoverflow.com/questions/18870283
复制相似问题