What's the easiest non-memory intensive way to output XML from Python? What's the easiest non-memory intensive way to output XML from Python? xml xml

What's the easiest non-memory intensive way to output XML from Python?


I think you'll find XMLGenerator from xml.sax.saxutils is the closest thing to what you want.

import timefrom xml.sax.saxutils import XMLGeneratorfrom xml.sax.xmlreader import AttributesNSImplLOG_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()        returnif __name__ == "__main__":    #Test it out    import sys    xl = xml_logger(sys.stdout, 'utf-8')    xl.write_entry(2, u"Vanilla log entry")    xl.close()   

You'll probably want to look at the rest of the article I got that from at http://www.xml.com/pub/a/2003/03/12/py-xml.html.


Some years ago I used MarkupWriter from 4suite

General-purpose utility class for generating XML (may eventually beexpanded to produce more output types)Sample usage:from Ft.Xml import MarkupWriterwriter = MarkupWriter(indent=u"yes")writer.startDocument()writer.startElement(u'xsa')writer.startElement(u'vendor')#Element with simple text (#PCDATA) contentwriter.simpleElement(u'name', content=u'Centigrade systems')#Note writer.text(content) still workswriter.simpleElement(u'email', content=u"info@centigrade.bogus")writer.endElement(u'vendor')#Element with an attributewriter.startElement(u'product', attributes={u'id': u"100\u00B0"})#Note writer.attribute(name, value, namespace=None) still workswriter.simpleElement(u'name', content=u"100\u00B0 Server")#XML fragmentwriter.xmlFragment('<version>1.0</version><last-release>20030401</last-release>')#Empty elementwriter.simpleElement(u'changes')writer.endElement(u'product')writer.endElement(u'xsa')writer.endDocument()Note on the difference between 4Suite writers and printersWriter  - module that exposes a broad public API for building output          bit by bitPrinter - module that simply takes a DOM and creates output from it          as a whole, within one API invokation

Recently i hear a lot about how lxml is great, but I don't have first-hand experience, and I had some fun working with gnosis.