2016-05-27 7 views
1

Ich habe versucht, den folgenden Code auszuführen, aber xmlrpclib hebt eine Ausnahme:Standard int-Wert mit xmlrpclib

>>> import xmlrpclib 
>>> data = """<?xml version="1.0"?> 
... <methodCall> 
...  <methodName>test_method</methodName> 
...  <params> 
...   <param> 
...    <value> 
...     <int/> 
...    </value> 
...   </param> 
...  </params> 
... </methodCall>""" 
>>> xmlrpclib.loads(data) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib64/python2.7/xmlrpclib.py", line 1141, in loads 
    p.feed(data) 
    File "/usr/lib64/python2.7/xmlrpclib.py", line 558, in feed 
    self._parser.Parse(data, 0) 
    File "/usr/lib64/python2.7/xmlrpclib.py", line 829, in end 
    return f(self, join(self._data, "")) 
    File "/usr/lib64/python2.7/xmlrpclib.py", line 864, in end_int 
    self.append(int(data)) 
ValueError: invalid literal for int() with base 10: '' 

Wenn ich ersetzen <int/> durch <int></int>, der Fehler gleich ist; aber mit <int>0</int> wird keine Ausnahme ausgelöst. Gleiche Ergebnisse in python3 mit xmlrpc.client.

Ich habe versucht, das Gleiche mit PHP, zu tun und es funktionierte ohne Probleme:

php > $data = '<?xml version="1.0"?><methodCall><methodName>test_method</methodName><params><param><value><int/></value></param></params></methodCall>'; 
php > print_r(xmlrpc_decode($data)); 
Array 
(
    [0] => 0 
) 

Die documentation aus der .NET-Implementierung bedeutet auch, dass <int/>-0 übersetzt werden würde:

Wenn ein XML-RPC-Strukturelement fehlt, wird das entsprechende .NET-Strukturelement auf null gesetzt und nicht auf den Standardwert für den Typ, wenn ein nicht Nullable-Typ verwendet wurde, z. B. null anstelle von null für eine ganze Zahl.

Ist dieses Verhalten ein Fehler von der Python-Implementierung?

+0

Ich denke schon. Füllen Sie den Fehlerbericht aus. – pacholik

+0

@pacholik Ich stelle die Frage, weil ich zu diesem Thema auf der offiziellen Website von XML-RPC keine wirkliche Spezifikation gefunden habe. Vielleicht funktioniert die PHP-Implementierung einfach, weil die Entwickler beschlossen haben, diesen Fall trotz der XML-RPC-Spezifikationen ihren Implementierungen zu erlauben? – julienc

+0

Ich sehe. Ich würde es trotzdem füllen - wenn PHP und .NET es unterstützen. – pacholik

Antwort

2

Ohne ein Urteil über Python-Implementierung :) dieser Affe-Patch behebt den Weg end_int() behandelt leere Daten. In Ihrem Beispiel vor dem Aufruf von xmlrpclib.loads (data):

class MyUnmarshaller(xmlrpclib.Unmarshaller): 

    def end_int(self, data): 
     self.append(int(data or "0")) 
     self._value = 0 
    dispatch = xmlrpclib.Unmarshaller.dispatch 
    dispatch["i4"] = end_int 
    dispatch["i8"] = end_int 
    dispatch["int"] = end_int 

xmlrpclib.Unmarshaller = MyUnmarshaller