2010-04-13 3 views
3

J'utilise xml.sax avec des chaînes Unicode de XML en entrée, entrées à l'origine à partir d'un formulaire Web. Sur ma machine locale (python 2.5, en utilisant l'expat xmlreader par défaut, en passant par le moteur de l'application), cela fonctionne très bien. Cependant, le même code et les mêmes chaînes d'entrée sur les serveurs de moteur d'application de production échouent avec "pas bien formé". Par exemple, il se produit avec le code ci-dessous:Analyse XML Unicode avec Python SAX sur 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) 

entraînant l'erreur:

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) 

Toute raison pour laquelle l'analyseur de moteur de l'application, qui utilise également python2.5 et expat, échouerait lors de l'entrée unicode ?

Répondre

3

Vous n'êtes pas censé analyser une chaîne unicode, vous devez analyser une chaîne codée en UTF-8. Une chaîne unicode n'est pas un fichier XML bien formé par défaut, conformément à la spécification XML 1.0. Vous devez donc convertir unicode en codage UTF-8 avant de le transmettre à l'analyseur.

+1

Vous avez raison, en passant dans original_string.encode ('utf-8') résout le problème. Bizarre que l'analyseur standard permette de passer unicode droit. –