2010-04-13 2 views
3

Я использую xml.sax с строками unicode XML в качестве входных данных, первоначально введенных из веб-формы. На моем локальном компьютере (python 2.5, использующем по умолчанию xmlreader expat, работающий через движок приложения), он отлично работает. Тем не менее, тот же самый код и входные строки на серверах серверов производственного приложения терпят неудачу с «неправильно сформированными». Например, это происходит на код ниже:Разбор XML-кода Unicode с Python SAX на 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) 

Любая причина, почему анализатор App Engine, которая также использует python2.5 и эмигранта, потерпит неудачу при вводе Юникода ?

ответ

3

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

+1

Вы правы, переходя в original_string.encode ('utf-8'), устраняет проблему. Странно, что стандартный синтаксический анализатор позволяет передавать прямой юникод. –

 Смежные вопросы

  • Нет связанных вопросов^_^