Was ist der einfachste Weg, intensive Nicht-Speichers zur Ausgabe von XML aus Python?

StackOverflow https://stackoverflow.com/questions/93710

  •  01-07-2019
  •  | 
  •  

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?

War es hilfreich?

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 .

Ich glaube, ich habe dein Gift:

http://sourceforge.net/projects/xmlite

Prost

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)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top