2009-05-31 10 views
1

Je travaille sur la production d'un document XML à partir de python. Nous utilisons le package xml.dom pour créer le document XML. Nous avons un problème où nous voulons produire le caractère & # x03c6; qui est un & # x03c6 ;. Cependant, quand nous mettons cette chaîne dans un nœud de texte et appelons toxml() dessus, nous obtenons & amp; # x03c6 ;. Notre solution actuelle est d'utiliser saxutils.unescape() sur le résultat de toxml() mais ce n'est pas idéal car nous devrons analyser le xml deux fois.Caractères XML dans python xml.dom

Y a-t-il un moyen pour que le paquet dom reconnaisse "& # x03c6;" en tant que personnage XML?

Répondre

1

Je pense que vous devez utiliser une chaîne Unicode avec \u03c6 en elle, parce que le champ .data d'un nœud de texte est censé (pour autant que je comprends) être données « analysées », ne comprenant pas des entités XML (d'où le & lorsque rendu en XML). Si vous voulez vous assurer que, sur la production, les caractères non-ascii sont exprimés en entités, vous pouvez faire:

import codecs 

def ent_replace(exc): 
    if isinstance(exc, (UnicodeEncodeError, UnicodeTranslateError)): 
    s = [] 
    for c in exc.object[exc.start:exc.end]: 
     s.append(u'&#x%4.4x;' % ord(c)) 
    return (''.join(s), exc.end) 
    else: 
    raise TypeError("can't handle %s" % exc.__name__) 

codecs.register_error('ent_replace', ent_replace) 

et utiliser x.toxml().encode('ascii', 'ent_replace').

Questions connexes