Básicamente, algo similar a System.Xml.XmlWriter - Un escritor de secuencias XML que no incurre en una gran sobrecarga de memoria. Entonces eso descarta xml.dom y xml.dom.minidom. Sugerencias?¿Cuál es la forma más fácil y no intensiva de memoria de exportar XML desde Python?
Respuesta
xml.etree.cElementTree, incluidos en la distribución por defecto de CPython desde 2,5. Rayo rápido para leer y escribir XML.
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)
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.
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
@rds 4suite todavía está disponible en http://pypi.python.org/pypi/4Suite-XML –
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.
+1: esta es la única respuesta de transmisión aquí que está incluida en python. –
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 :-))
- 1. ¿Cuál es la forma más fácil de exportar una base de datos SQLServer 2000 a XML?
- 2. ¿Cuál es la forma más fácil de leer un archivo DBF de FoxPro desde Python?
- 3. ¿Cuál es la forma más fácil de exportar datos desde una aplicación de motor de aplicación de Google en vivo?
- 4. C#: ¿cuál es la forma más fácil de restar tiempo?
- 5. ¿Cuál es la forma más fácil de animar una línea?
- 6. ¿Cuál es la forma más fácil de eliminar todos los atributos de un XML en C#?
- 7. ¿Cuál es la forma más fácil de generar xml en C++?
- 8. ¿Cuál es la forma más fácil de aplicar las series de parches de Git desde Thunderbird
- 9. ¿Cuál es el enfoque más fácil para exportar una lista Sharepoint en formato xml?
- 10. ¿Cuál es la forma más fácil de explicar qué es Hadoop y mapa/reducir?
- 11. ¿Cuál es la forma más fácil de acceder a un micrófono de una computadora en Python?
- 12. ¿Cuál es la forma más fácil en Perl puro de transmitir desde otro recurso HTTP?
- 13. La forma más fácil de rm -rf en Python
- 14. ¿Cuál es la forma más fácil de saber si una gramática BNF es ambigua o no?
- 15. ¿Cuál es la forma más fácil de crear una extensión C opcional para un paquete python?
- 16. ¿Cuál es la forma más simple de usar SSH Python?
- 17. ¿Cuál es la forma más fácil de escanear HTML en Python?
- 18. La manera más fácil de escribir y leer un XML
- 19. ¿La forma más fácil de validar y leer un archivo xml en .net?
- 20. Ejecutar una tarea intensiva de CPU/memoria: ¿qué enfoque de codificación es el más eficaz?
- 21. ¿Cuál es la forma más eficiente de copiar de forma masiva a SQL Server desde Java?
- 22. ¿Cuál es la forma más fácil de convertir la lista con str en list con int?
- 23. Cuál es la forma más fácil de convertir latitud y longitud a los valores dobles
- 24. ¿Cuál es la mejor y más fácil forma de crear un formulario UITableView?
- 25. ¿La forma más fácil de encontrar y reemplazar recursivamente?
- 26. ¿Cuál es la forma más fácil de crear un sitio web de reserva de citas?
- 27. La forma más fácil de transferir datos por Internet, Python
- 28. ¿Cuál es la forma más fácil de exponer subfunciones de archivos M para pruebas unitarias?
- 29. ¿Cuál es la forma más fácil de persistir en los objetos java?
- 30. ¿Cuál es la forma más rápida de analizar grandes documentos XML en Python?
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. –