Разбор на unicode XML с Python SAX на App Engine

Използвам xml.sax с unicode низове от XML като вход, първоначално въведен от уеб формуляр. На моята локална машина (python 2.5, използвайки xmlreader expat по подразбиране, работещ през app engine), работи добре. Въпреки това, абсолютно същият код и входни низове на производствени сървъри на машина за приложения се провалят с „недобре оформени“. Например, това се случва с кода по-долу:

from xml import sax
class MyHandler(sax.ContentHandler):
  pass

handler = MyHandler()
# Both of these unicode strings return 'not well-formed' 
# on app engine, but work locally
xml.parseString(u"<a>b</a>",handler) 
xml.parseString(u"<!DOCTYPE a[<!ELEMENT a (#PCDATA)> ]><a>b</a>",handler)

# Both of these work, but output unicode
xml.parseString("<a>b</a>",handler) 
xml.parseString("<!DOCTYPE a[<!ELEMENT a (#PCDATA)> ]><a>b</a>",handler)

което води до грешката:

  File "<string>", line 1, in <module>
  File "/base/python_dist/lib/python2.5/xml/sax/__init__.py", line 49, in parseString
    parser.parse(inpsrc)
  File "/base/python_dist/lib/python2.5/xml/sax/expatreader.py", line 107, in parse
    xmlreader.IncrementalParser.parse(self, source)
  File "/base/python_dist/lib/python2.5/xml/sax/xmlreader.py", line 123, in parse
    self.feed(buffer)
  File "/base/python_dist/lib/python2.5/xml/sax/expatreader.py", line 211, in feed
    self._err_handler.fatalError(exc)
  File "/base/python_dist/lib/python2.5/xml/sax/handler.py", line 38, in fatalError
    raise exception
SAXParseException: <unknown>:1:1: not well-formed (invalid token)

Някаква причина, поради която анализаторът на приложението, който също използва python2.5 и expat, ще се провали при въвеждане на unicode?


person Derek Dahmer    schedule 13.04.2010    source източник


Отговори (1)


Не трябва да анализирате низ в Unicode, трябва да анализирате низ, кодиран с UTF-8. Unicode низът не е добре формиран XML по подразбиране, съгласно спецификацията на XML 1.0. Така че трябва да конвертирате unicode в UTF-8 кодиране, преди да го подадете към анализатора.

person vtd-xml-author    schedule 14.04.2010
comment
Прав си, предаването на original_string.encode('utf-8') решава проблема. Странно, че стандартният анализатор позволява предаването на прав уникод. - person Derek Dahmer; 15.04.2010