2013-04-05 8 views
17

unterstützt Versuch, die folgende ...XML Unicode-Strings mit Kodierungsdeklaration nicht

from lxml import etree 
from lxml.etree import fromstring 

if request.POST: 
    parser = etree.XMLParser(ns_clean=True, recover=True) 
    h = fromstring(request.POST['xml'], parser=parser) 
    return HttpResponse(h.cssselect('itagg_delivery_receipt status').text_content()) 

aber es geben, diesen Fehler zu tun:

[Fri Apr 05 10:27:54 2013] [error] Internal Server Error: /sms/status_postback/ 
[Fri Apr 05 10:27:54 2013] [error] Traceback (most recent call last): 
[Fri Apr 05 10:27:54 2013] [error] File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 115, in get_response 
[Fri Apr 05 10:27:54 2013] [error]  response = callback(request, *callback_args, **callback_kwargs) 
[Fri Apr 05 10:27:54 2013] [error] File "/usr/local/lib/python2.7/dist-packages/django/views/decorators/csrf.py", line 77, in wrapped_view 
[Fri Apr 05 10:27:54 2013] [error]  return view_func(*args, **kwargs) 
[Fri Apr 05 10:27:54 2013] [error] File "/srv/project/livewireSMS/sms/views.py", line 42, in update_delivery_status 
[Fri Apr 05 10:27:54 2013] [error]  h = fromstring(request.POST['xml'], parser=parser) 
[Fri Apr 05 10:27:54 2013] [error] File "lxml.etree.pyx", line 2754, in lxml.etree.fromstring (src/lxml/lxml.etree.c:54631) 
[Fri Apr 05 10:27:54 2013] [error] File "parser.pxi", line 1569, in lxml.etree._parseMemoryDocument (src/lxml/lxml.etree.c:82659) 
[Fri Apr 05 10:27:54 2013] [error] ValueError: Unicode strings with encoding declaration are not supported. 

Dies ist der XML

<?xml version="1.1" encoding="ISO-8859-1"?> 
<itagg_delivery_receipt> 
<version>1.0</version> 
<msisdn>447889000000</msisdn> 
<submission_ref> 
845tgrgsehg394g3hdfhhh56445y7ts6</ 
submission_ref> 
<status>Delivered</status> 
<reason>4</reason> 
<timestamp>20050709120945</timestamp> 
<retry>0</retry> 
</itagg_delivery_receipt> 

Ich habe keine Kontrolle über das XML-Dokument, das von der SMS-Firma kommt.

+0

Vom lxml FAQ: [* Warum kann lxml meine XML nicht von Unicode-Strings analysieren? *] (Http://lxml.de/FAQ.html#why-can-t-lxml-parse-my-xml-from-unicode-strings) –

+0

Mögliche Duplikate von [XML-Datei parsen wird UnicodeEncodeError (ElementTree)/ValueError (lxml)] (https://stackoverflow.com/questions/15622027/parsing-xml-file) -gets-unicodeencodeerror-elementtree-valueerror-lxml) –

Antwort

28

Sie werden es kodieren und dann in dem Parser die gleiche Codierung erzwingen:

from lxml import etree 
from lxml.etree import fromstring 

if request.POST: 
    xml = request.POST['xml'].encode('utf-8') 
    parser = etree.XMLParser(ns_clean=True, recover=True, encoding='utf-8') 
    h = fromstring(xml, parser=parser) 

    return HttpResponse(h.cssselect('delivery_reciept status').text_content()) 
+0

Kann ein eigenständiges Beispiel bereitgestellt werden, in dem die XML-Daten im Code definiert sind? –

7

Die folgende Lösung von kernc für mich gearbeitet:

>>> from lxml import etree 
>>> xml = u'<?xml version="1.0" encoding="utf-8" ?><foo><bar/></foo>' 
>>> xml = bytes(bytearray(xml, encoding='utf-8')) # ADDENDUM OF THIS LINE (when unicode means utf-8, e.g. on Linux) 
>>> etree.XML(xml) 
<Element html at 0x5b44c90> 
+0

Interessant. Auch nach dem Lesen der [Seite] (https://gist.github.com/karlcow/3258330#gistcomment-769151), die die Problemumgehung vorschlägt, vermisse ich Fräulein, warum Entschlüsselung fehlschlägt ...: S – Pintun