2008-09-18 37 views

回答

-4

xml.etree.cElementTree,包含在2.5以來的CPython的默認分配。閱讀和編寫XML都閃電般快速。

+4

儘管如此,cElementTree不是流式寫入器,因此會使用內存線性來創建您所創建的XML樹的大小,儘管遠小於xml.dom。 – 2008-09-20 19:09:54

-1

我一直有良好的結果lxml。這是一個痛苦的安裝,因爲它主要是圍繞libxml2包裝,但lxml.etree樹對象有一個.write()方法,需要一個類文件對象流。

from lxml.etree import XML 

tree = XML('<root><a><b/></a></root>') 
tree.write(your_file_object) 
0

幾年前,我用MarkupWriter4suite

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是偉大的,但我沒有第一手的經驗,和我與gnosis工作有一些樂趣。

+0

恐怕4suite不再在線。至於lxml,這很棒,但沒有一個令人窒息的設施AFAIK。 – rds 2012-01-06 14:04:11

+0

@rds 4suite仍然可以在http://pypi.python.org/pypi/4Suite-XML – 2012-01-09 17:40:21

13

我想你會從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

-2

ElementTree的第二票(cElementTree是一個C實現,有點快,就像cPickle vs pickle)。這裏有一些簡短的示例代碼,你可以看看它們,讓你知道它是如何工作的:http://effbot.org/zone/element-index.htm (這是Fredrik Lundh,他首先編寫了這個模塊,它非常好用2.5編寫的標準庫:-))

相關問題