2008-09-18 31 views

Trả lời

-4

xml.etree.cElementTree, bao gồm trong phân phối mặc định của CPython kể từ 2.5. Sét nhanh cho cả đọc và viết XML.

+4

Tuy nhiên, cElementTree không phải là một nhà văn trực tuyến và do đó sẽ sử dụng tuyến tính bộ nhớ với kích thước của cây XML mà bạn tạo, mặc dù ít hơn xml.dom. –

-1

Tôi luôn có kết quả tốt với lxml. Đó là một nỗi đau để cài đặt, vì nó chủ yếu là một wrapper xung quanh libxml2, nhưng lxml.etree đối tượng cây có một phương pháp .write() mà có một đối tượng giống như tập tin để dòng.

from lxml.etree import XML 

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

Một vài năm trước, tôi đã sử dụng MarkupWriter từ 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 

Gần đây tôi nghe rất nhiều về cách lxml là rất tốt, nhưng tôi không có kinh nghiệm đầu tay, và tôi có một số niềm vui khi làm việc với gnosis.

+0

Tôi sợ 4suite không trực tuyến nữa. Đối với lxml, nó tuyệt vời nhưng không có cơ sở styAing AFAIK. – rds

+0

@rds 4suite vẫn có sẵn tại http://pypi.python.org/pypi/4Suite-XML –

13

Tôi nghĩ bạn sẽ tìm thấy XMLGenerator từ xml.sax.saxutils là điều gần nhất với những gì bạn muốn.

 
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() 

Có thể bạn sẽ muốn xem phần còn lại của bài viết tôi nhận được từ số http://www.xml.com/pub/a/2003/03/12/py-xml.html.

+0

+1: đây là câu trả lời trực tuyến duy nhất ở đây được xây dựng cho python. –

-2

Bỏ phiếu thứ hai cho ElementTree (cElementTree là triển khai C nhanh hơn một chút, như cPickle vs pickle). Có một số mã ví dụ ngắn ở đây mà bạn có thể xem để cung cấp cho bạn ý tưởng về cách hoạt động: http://effbot.org/zone/element-index.htm (đây là Fredrik Lundh, người đã viết mô-đun ở vị trí đầu tiên. Thật tuyệt vời khi nó được soạn thảo vào thư viện chuẩn với 2.5 :-))

Các vấn đề liên quan