Анализ Unicode XML с помощью Python SAX в App Engine

Я использую xml.sax со строками XML в формате Unicode в качестве входных данных, первоначально введенных из веб-формы. На моем локальном компьютере (python 2.5, с использованием xmlreader expat по умолчанию, работающего через механизм приложения) он работает нормально. Однако точно такой же код и входные строки на серверах движка рабочих приложений терпят неудачу с «некорректным форматом». Например, это происходит с кодом ниже:

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, не работает при вводе юникода?


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


Ответы (1)


Вы не должны анализировать строку Unicode, вы должны анализировать строку в кодировке UTF-8. Строка Unicode по умолчанию не является правильно сформированным XML в соответствии со спецификацией XML 1.0. Поэтому вам нужно преобразовать юникод в кодировку UTF-8, прежде чем передавать его парсеру.

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