Về cơ bản, một cái gì đó tương tự như System.Xml.XmlWriter - Một luồng Writer XML không phải chịu nhiều chi phí bộ nhớ. Vì vậy, các quy tắc đó ra xml.dom và xml.dom.minidom. Gợi ý?Cách đơn giản nhất không tốn nhiều bộ nhớ để xuất XML từ Python là gì?
Trả lời
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.
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)
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.
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
@rds 4suite vẫn có sẵn tại http://pypi.python.org/pypi/4Suite-XML –
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.
+1: đây là câu trả lời trực tuyến duy nhất ở đây được xây dựng cho python. –
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 :-))
- 1. Cách đơn giản nhất để SSH bằng Python là gì?
- 2. Cách tốt nhất để viết về cách viết một bộ x86 đơn giản là gì?
- 3. .Net Bộ nhớ trong bộ nhớ đơn giản
- 4. Cách đơn giản nhất để xuất bản qua Zeroconf/Bonjour?
- 5. đơn giản nhất cách để truy vấn XML trong Java
- 6. Cách đơn giản nhất để sao chép một tập lệnh python trong Linux là gì?
- 7. Cách đơn giản nhất để xác định biến cục bộ trong Oracle là gì?
- 8. Cách đơn giản nhất để thực hiện phân tích xml cơ bản từ dòng lệnh unix
- 9. "lambda" có nghĩa là gì trong Python, và cách đơn giản nhất để sử dụng nó là gì?
- 10. Cách đơn giản nhất để phân tích cú pháp JSON trong Scala là gì?
- 11. Cách đơn giản nhất để gọi url POST POST bằng Delphi là gì?
- 12. Cách tách một tệp XML theo cách đơn giản trong Python?
- 13. Cách đơn giản nhất để giảm ngày trong Javascript là 1 ngày là gì?
- 14. Quản lý bộ nhớ/bộ nhớ đệm cho các đối tượng tốn kém trong C#
- 15. Điều gì là sai với metaclass python đơn giản này?
- 16. Tìm bộ đệm Java đơn giản trong bộ nhớ
- 17. Cách đơn giản nhất để phát mp3 từ Visual C++
- 18. Hệ thống đơn giản nhất để gửi tin nhắn từ máy chủ Linux là gì?
- 19. Cách đơn giản nhất để cập nhật lược đồ mnesia là gì?
- 20. Cách đơn giản nhất để chạy kịch bản mong đợi từ python
- 21. Cách đơn giản nhất để thêm ảnh tiểu sử bằng Đá quý Omniauth-Facebook là gì?
- 22. Cách tốt nhất để kiểm tra đơn vị một phương pháp không đồng bộ là gì?
- 23. Cách đơn giản nhất để kiểm tra đơn vị Mã C bằng Python
- 24. Cách đơn giản nhất để truy xuất int từ kết quả mongo?
- 25. Sử dụng bộ nhớ Python: Đối tượng nào của tôi đang chiếm nhiều bộ nhớ nhất?
- 26. Cách đơn giản nhất để tạo cửa sổ hình trong wxPython là gì?
- 27. Khung công tác WSGI đơn giản/nhẹ nhất là gì?
- 28. Thuật toán đơn giản nhất để thoát khỏi một ký tự đơn lẻ là gì?
- 29. Cách dễ nhất để lấy dữ liệu theo dõi từ đầu đọc thẻ từ USB HID đơn giản là gì?
- 30. Cách đơn giản nhất để viết thành stdout ở chế độ nhị phân là gì?
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. –