2008-09-18 16 views

Respuesta

-4

xml.etree.cElementTree, incluidos en la distribución por defecto de CPython desde 2,5. Rayo rápido para leer y escribir XML.

+4

Aún así, cElementTree no es un escritor de transmisión y por lo tanto utilizará la memoria lineal para el tamaño del árbol XML que cree, aunque mucho menos que xml.dom. –

-1

Siempre he tenido buenos resultados con lxml. Es difícil de instalar, ya que es principalmente un contenedor alrededor de libxml2, pero los objetos de árbol lxml.etree tienen un método .write() que lleva un objeto similar a un archivo para transmitir. Hace

from lxml.etree import XML 

tree = XML('<root><a><b/></a></root>') 
tree.write(your_file_object) 
0

algunos años utilizado MarkupWriter de 4suite

General-purpose utility class for generating XML (may eventually be 
expanded to produce more output types) 

Sample usage: 

from Ft.Xml import MarkupWriter 
writer = MarkupWriter(indent=u"yes") 
writer.startDocument() 
writer.startElement(u'xsa') 
writer.startElement(u'vendor') 
#Element with simple text (#PCDATA) content 
writer.simpleElement(u'name', content=u'Centigrade systems') 
#Note writer.text(content) still works 
writer.simpleElement(u'email', content=u"[email protected]") 
writer.endElement(u'vendor') 
#Element with an attribute 
writer.startElement(u'product', attributes={u'id': u"100\u00B0"}) 
#Note writer.attribute(name, value, namespace=None) still works 
writer.simpleElement(u'name', content=u"100\u00B0 Server") 
#XML fragment 
writer.xmlFragment('<version>1.0</version><last-release>20030401</last-release>') 
#Empty element 
writer.simpleElement(u'changes') 
writer.endElement(u'product') 
writer.endElement(u'xsa') 
writer.endDocument() 

Note on the difference between 4Suite writers and printers 
Writer - module that exposes a broad public API for building output 
      bit by bit 
Printer - module that simply takes a DOM and creates output from it 
      as a whole, within one API invokation 

Recientemente he oído mucho acerca de cómo lxml es grande, pero no tengo experiencia de primera mano, y yo se divirtió trabajando con gnosis.

+0

Me temo que 4suite ya no está en línea. En cuanto a lxml, es genial, pero no tiene una instalación styreaming AFAIK. – rds

+0

@rds 4suite todavía está disponible en http://pypi.python.org/pypi/4Suite-XML –

13

Creo que encontrará que XMLGenerator de xml.sax.saxutils es lo más parecido a lo que desea.

 
import time 
from xml.sax.saxutils import XMLGenerator 
from xml.sax.xmlreader import AttributesNSImpl 

LOG_LEVELS = ['DEBUG', 'WARNING', 'ERROR'] 


class xml_logger: 
    def __init__(self, output, encoding): 
     """ 
     Set up a logger object, which takes SAX events and outputs 
     an XML log file 
     """ 
     logger = XMLGenerator(output, encoding) 
     logger.startDocument() 
     attrs = AttributesNSImpl({}, {}) 
     logger.startElementNS((None, u'log'), u'log', attrs) 
     self._logger = logger 
     self._output = output 
     self._encoding = encoding 
     return 

    def write_entry(self, level, msg): 
     """ 
     Write a log entry to the logger 
     level - the level of the entry 
     msg - the text of the entry. Must be a Unicode object 
     """ 
     #Note: in a real application, I would use ISO 8601 for the date 
     #asctime used here for simplicity 
     now = time.asctime(time.localtime()) 
     attr_vals = { 
      (None, u'date'): now, 
      (None, u'level'): LOG_LEVELS[level], 
      } 
     attr_qnames = { 
      (None, u'date'): u'date', 
      (None, u'level'): u'level', 
      } 
     attrs = AttributesNSImpl(attr_vals, attr_qnames) 
     self._logger.startElementNS((None, u'entry'), u'entry', attrs) 
     self._logger.characters(msg) 
     self._logger.endElementNS((None, u'entry'), u'entry') 
     return 

    def close(self): 
     """ 
     Clean up the logger object 
     """ 
     self._logger.endElementNS((None, u'log'), u'log') 
     self._logger.endDocument() 
     return 

if __name__ == "__main__": 
    #Test it out 
    import sys 
    xl = xml_logger(sys.stdout, 'utf-8') 
    xl.write_entry(2, u"Vanilla log entry") 
    xl.close() 

es probable que desee para mirar el resto del artículo que llegué de al http://www.xml.com/pub/a/2003/03/12/py-xml.html.

+0

+1: esta es la única respuesta de transmisión aquí que está incluida en python. –

-2

Segunda votación para ElementTree (cElementTree es una implementación C que es un poco más rápida, como cPickle vs pickle). Aquí hay un breve código de ejemplo que puedes ver para darte una idea de cómo funciona: http://effbot.org/zone/element-index.htm (este es Fredrik Lundh, quien escribió el módulo en primer lugar. Es tan bueno que se incluyó en la biblioteca estándar con 2.5 :-))

Cuestiones relacionadas