libreria - lxml python 3
¿Cuál es la forma más fácil y no intensiva de memoria de exportar XML desde Python? (6)
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()
Probablemente quiera consultar el resto del artículo que obtuve en http://www.xml.com/pub/a/2003/03/12/py-xml.html .
Básicamente, algo similar a System.Xml.XmlWriter - Un escritor de secuencias de XML que no incurre en una gran sobrecarga de memoria. Entonces eso descarta xml.dom y xml.dom.minidom. Sugerencias?
Segundo voto para ElementTree (cElementTree es una implementación C que es un poco más rápida, como cPickle vs pickle). Aquí hay un breve ejemplo de código 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 redactó en la biblioteca estándar con 2.5 :-))
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.
from lxml.etree import XML
tree = XML(''<root><a><b/></a></root>'')
tree.write(your_file_object)
xml.etree.cElementTree , incluido en la distribución predeterminada de CPython desde 2.5. Rayo rápido para leer y escribir XML.
Hace algunos años utilicé MarkupWriter
desde 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 escuché mucho sobre cómo lxml es genial, pero no tengo experiencia de primera mano, y me divertí trabajando con la gnosis .