Was ist der einfachste Weg, intensive Nicht-Speichers zur Ausgabe von XML aus Python?
Frage
Im Grunde etwas ähnliches wie System.Xml.XmlWriter - Ein Streaming XML Writer, die nicht viel von einem Speicher-Overhead nicht entstehen. So urteilt, dass xml.dom und xml.dom.minidom aus. Vorschläge?
Lösung
xml.etree.cElementTree , da 2.5 in der Standard-Distribution von CPython enthalten. Blitzschnelle zum Lesen und Schreiben von XML.
Andere Tipps
Ich glaube, Sie XMLGenerator von xml.sax.saxutils zu finden, ist die nächste Sache, was Sie wollen.
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()
Sie werden wahrscheinlich am Rest des Artikels aussehen soll ich bekam, dass von http://www.xml.com/pub/a/2003/03/12/py-xml.html .
Vor einigen Jahren habe ich MarkupWriter
von 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"info@centigrade.bogus") 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
Vor kurzem höre ich viel darüber, wie lxml ist groß, aber ich habe nicht aus erster Hand Erfahrung, und ich hatte etwas Spaß mit Arbeit Gnosis .
Ich habe immer gute Ergebnisse mit lxml . Es ist ein Schmerz zu installieren, da es meistens um einen Wrapper libxml2 , aber lxml.etree
Baumobjekte haben eine .write()
Methode, die eine nimmt Datei-ähnliche Objekt zu streamen.
from lxml.etree import XML
tree = XML('<root><a><b/></a></root>')
tree.write(your_file_object)
Zweitstimme für ElementTree (celementtree ist eine C-Implementierung, die ein wenig schneller, wie cPickle vs Gurke ist). Es gibt einige kurze Codebeispiele, die Sie, um Ihnen eine Vorstellung davon, aussehen kann, wie es funktioniert: http : //effbot.org/zone/element-index.htm (Dies ist Fredrik Lundh, der das Modul an erster Stelle geschrieben habe. Es ist so gut es in der Standardbibliothek mit 2,5 :-) verfasst wurde)