首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何调整xmlrpclib以解释自定义类型?

如何调整xmlrpclib以解释自定义类型?
EN

Stack Overflow用户
提问于 2013-09-18 10:52:37
回答 1查看 572关注 0票数 3

几天来,我一直在解决这个问题上遇到困难,在互联网上找不到任何有用的资源,所以我将分享我在这个问题上的发现,供以后参考:

Python2.7 xmlrpclib客户端具有XMLRPC标准内置定义的类型,以及一些常见的扩展。但是,其他XMLRPC服务器,例如Apache,有时会使用它们自己的类型,或者将扩展放在特殊的名称空间中,等等。

例如,当您用Apache发送一个8字节整数时( XMLRPC标准未涵盖),它将发送以下响应:

代码语言:javascript
复制
<methodResponse xmlns:ex="http://ws.apache.org/xmlrpc/namespaces/extensions">
    <params>
        <param>
            <value>
                <ex:i8>123456789</ex:i8>
            </value>
        </param>
    </params>
</methodResponse>

如果您天真地尝试用Python处理这些类型,您将得到一个空的元组结果。如何调整xmlrpclib以处理此类案件?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-18 10:52:37

在内部,xmlrpclib使用xmlrpclib.Unmarshaller来分派响应。Unmarshaller有一个dispatch字典,其中为每个类型分配了一个函数来处理它。

让问题的示例工作起来其实很容易,因为xmlrpclib已经可以处理i8了,我们只需将ex:i8重新映射到:

代码语言:javascript
复制
xmlrpclib.Unmarshaller.dispatch['ex:i8'] = xmlrpclib.Unmarshaller.dispatch['i8']

但是对于更多的自定义类型,可能需要编写分派函数。它们被设计为在Unmarshaller中定义,因此一个典型的调度函数如下所示:

代码语言:javascript
复制
def end_int(self, data):
    self.append(int(data))
    self._value = 0
dispatch['i8'] = end_int

_value = 0只是表示调度成功。所以如果我们有

代码语言:javascript
复制
<methodResponse>
    <params>
        <param>
            <value>
                <mycustom>some value</mycustom>
            </value>
        </param>
     </params>
</methodResponse>

我们可以界定:

代码语言:javascript
复制
def mycustom_parser(unmarshaller, data):
    unmarshaller.append(data.split())
    unmarshaller._value = 0
xmlrpclib.Unmarshaller.dispatch['mycustom'] = mycustom_parser
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18870283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档