3

私は何日もこの問題を解決するのに苦労しており、インターネット上でこれに関する有用なリソースを見つけることができなかったので、今後の参考のためにこの問題に関する私の調査結果を共有します:

Python 2.7xmlrpclibクライアントには、組み込みの XMLRPC 標準によって定義された型と、いくつかの一般的な拡張機能があります。ただし、Apache などの他の XMLRPC サーバーは、独自の型を使用したり、拡張機能を特別な名前空間に配置したりすることがあります。

たとえば、Apache (XMLRPC 標準でカバーされていない) で 8 バイトの整数を送信すると、次の応答が送信されます。

<methodResponse xmlns:ex="http://ws.apache.org/xmlrpc/namespaces/extensions">
    <params>
        <param>
            <value>
                <ex:i8>123456789</ex:i8>
            </value>
        </param>
    </params>
</methodResponse>

これらの型を単純に Python で処理しようとすると、空のタプルの結果が得られます。そのような場合を処理するためにどのように調整できxmlrpclibますか?

4

1 に答える 1

4

内部的には、 を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_parser
于 2013-09-18T10:52:37.340 に答える