2010-12-06 26 views
0

J'utilise le code suivant pour lire un fichier XML et l'écrire dans un fichier de sortie XML à l'aide de l'analyseur syntaxique SAX. Cependant, le fichier de sortie ne contient pas les directives CDATA. Le contenu de la section CDATA est là, mais le <![CDATA[ de départ et le ]]> de fermeture ne sont pas présents dans le fichier de sortie!Directive CDATA absente de la sortie de l'analyseur SAX

from xml.sax import make_parser 
from xml.sax.handler import ContentHandler 
import sys 

class XMLWriter(): 
    def __init__ (self, xWriter): 
      self.xWriter = xWriter 

    def startElement(self, name, attrs): 
     self.xWriter.write('<' + name) 
     for sAttribute in attrs.getNames(): 
      self.xWriter.write(' %s="%s"' % (sAttribute, attrs.getValue(sAttribute))) 
     self.xWriter.write('>') 

    def characters (self, ch): 
     self.xWriter.write(ch) 

    def endElement(self, name): 
     self.xWriter.write('</'+ name + '>') 

    def processingInstruction(self, target, data): 
     return 
    def setDocumentLocator(self, dummy): 
     return 
    def startDocument(self): 
     return 
    def endDocument(self): 
     return 

parser = make_parser()  
curHandler = XMLWriter(open('test.out.xml', 'w')) 
parser.setContentHandler(curHandler) 
parser.parse(open('test.xml')) 

Qu'est-ce que je fais mal?

Répondre

0

CDATA est une annotation de commodité utilisée pour inclure du texte contenant du balisage. Le fait qu'un noeud de texte ait été inclus dans CDATA dans une sérialisation particulière peut être conservé par l'analyseur ou peut être rejeté. Si votre analyseur syntaxique SAX a des événements pour les sections CDATA, vous devez les gérer, puis réenrouler le nœud de texte dans CDATA à la sortie.