





xml.etree.cElementTree, включенный в дистрибутив CPython по умолчанию, начиная с версии 2.5. Молниеносно как для чтения, так и для записи XML.
У меня всегда были хорошие результаты с lxml. Его сложно установить, поскольку это в основном оболочка вокруг libxml2, но объекты дерева lxml.etree имеют метод .write(), который принимает файловый объект для потоковой передачи.
from lxml.etree import XML
tree = XML('<root><a><b/></a></root>')
tree.write(your_file_object)
Несколько лет назад я использовал MarkupWriter от 4 люкса
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
В последнее время я много слышу о том, насколько хорош lxml, но у меня нет личного опыта, и мне было весело работать с гнозис.
Боюсь, что 4suite больше не в сети. Что касается lxml, он великолепен, но не имеет средства стриминга AFAIK.
Я думаю, вы найдете XMLGenerator из xml.sax.saxutils - это самое близкое к тому, что вам нужно.
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()
Вы, вероятно, захотите посмотреть оставшуюся часть статьи, которую я получил из http://www.xml.com/pub/a/2003/03/12/py-xml.html.
+1: это единственный потоковый ответ, встроенный в python.
Второе голосование за ElementTree (cElementTree - это реализация C, которая немного быстрее, например cPickle vs pickle). Здесь есть небольшой пример кода, на который вы можете посмотреть, чтобы получить представление о том, как это работает: http://effbot.org/zone/element-index.htm (это Фредрик Лунд, который первым написал модуль. Он настолько хорош, что его встроили в стандартную библиотеку с помощью 2.5 :-))
Тем не менее, cElementTree не является потоковым писателем и, таким образом, будет использовать память линейно по размеру создаваемого XML-дерева, хотя и намного меньше, чем xml.dom.