基本上,類似於System.Xml.XmlWriter的東西 - 一種流式XML編寫器,不會產生太多的內存開銷。這樣就排除了xml.dom和xml.dom.minidom。建議?什麼是從Python輸出XML最簡單的非內存密集型方法?
回答
xml.etree.cElementTree,包含在2.5以來的CPython的默認分配。閱讀和編寫XML都閃電般快速。
幾年前,我用MarkupWriter
從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
恐怕4suite不再在線。至於lxml,這很棒,但沒有一個令人窒息的設施AFAIK。 – rds 2012-01-06 14:04:11
@rds 4suite仍然可以在http://pypi.python.org/pypi/4Suite-XML – 2012-01-09 17:40:21
我想你會從xml.sax.saxutils找到XMLGenerator是最接近你想要的東西。
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。
ElementTree的第二票(cElementTree是一個C實現,有點快,就像cPickle vs pickle)。這裏有一些簡短的示例代碼,你可以看看它們,讓你知道它是如何工作的:http://effbot.org/zone/element-index.htm (這是Fredrik Lundh,他首先編寫了這個模塊,它非常好用2.5編寫的標準庫:-))
- 1. 從XML中刪除值的最簡單方法是什麼
- 2. 從C++調用Java方法的最簡單方法是什麼?
- 3. 什麼是從Javascript調用C#方法的最簡單方法
- 4. 什麼是春季最簡單/最透明的緩存方法?
- 5. 什麼是加密word和pdf文件的最簡單方法?
- 6. 在c#中加密文件最簡單的方法是什麼?
- 7. 從編譯包獲得Python輸出的最簡單方法?
- 8. 將DOCTYPE添加到Scala XML的最簡單方法是什麼?
- 9. 在C++中生成xml最簡單的方法是什麼?
- 10. 將xml轉換爲html最簡單的方法是什麼?
- 11. 在DesignMode中編輯集合的最簡單方法是什麼?
- 12. 用Python安裝OpenVAS omblib最簡單的方法是什麼?
- 13. 在Python中創建表格最簡單的方法是什麼?
- 14. 用python執行WHOIS協議最簡單的方法是什麼?
- 15. 使用Python進行SSH的最簡單方法是什麼?
- 16. 將python腳本變成webapp最簡單的方法是什麼?
- 17. 探索Rally對象模型最簡單的方法是什麼?
- 18. 同步模型更改的最簡單方法是什麼? Rails
- 19. 將SQLServer 2000數據庫導出到XML最簡單的方法是什麼?
- 20. 在VB.net中保存設置的最簡單方法是什麼
- 21. 訪問Azure文件存儲的最簡單方法是什麼?
- 22. Android:保存少量數據的最簡單方法是什麼?
- 23. 保存加密/解密密鑰的最佳方法是什麼?
- 24. 什麼是從csv到數據庫的最簡單的方法?
- 25. 什麼是從XML數據中刪除換行符的最簡單方法
- 26. 從xml文檔中提取純文本最簡單的方法是什麼?
- 27. 在VSTS中壓縮生成過程輸出的最簡單方法是什麼?
- 28. 彈出交互式Python控制檯最簡單的方法是什麼?
- 29. 什麼是從JAXP SAX ContentHandler發出XML的最節省內存的方式?
- 30. 從Django發送文本最簡單的方法是什麼?
儘管如此,cElementTree不是流式寫入器,因此會使用內存線性來創建您所創建的XML樹的大小,儘管遠小於xml.dom。 – 2008-09-20 19:09:54