基本上,类似于 System.Xml.XmlWriter - 一种不会产生太多内存开销的流式 XML 编写器。这样就排除了 xml.dom 和 xml.dom.minidom。建议?
2605 次
6 回答
15
我想你会发现 xml.sax.saxutils 中的 XMLGenerator 是最接近你想要的东西。
进口时间
从 xml.sax.saxutils 导入 XMLGenerator
从 xml.sax.xmlreader 导入 AttributesNSImpl
LOG_LEVELS = ['调试','警告','错误']
类 xml_logger:
def __init__(自我,输出,编码):
"""
设置一个记录器对象,它接受 SAX 事件和输出
XML 日志文件
"""
logger = XMLGenerator(输出,编码)
logger.startDocument()
attrs = AttributesNSImpl({}, {})
logger.startElementNS((None, u'log'), u'log', attrs)
self._logger = 记录器
self._output = 输出
self._encoding = 编码
返回
def write_entry(self, level, msg):
"""
将日志条目写入记录器
level - 条目的级别
msg - 条目的文本。必须是 Unicode 对象
"""
#注意:在实际应用中,我会使用 ISO 8601 作为日期
为简单起见,此处使用 #asctime
现在 = time.asctime(time.localtime())
attr_vals = {
(无,你的日期'):现在,
(无,u'level'):LOG_LEVELS[level],
}
attr_qnames = {
(无, u'date'): u'date',
(无, u'level'): u'level',
}
attrs = AttributesNSImpl(attr_vals, attr_qnames)
self._logger.startElementNS((None, u'entry'), u'entry', attrs)
self._logger.characters(味精)
self._logger.endElementNS((None, u'entry'), u'entry')
返回
def 关闭(自我):
"""
清理记录器对象
"""
self._logger.endElementNS((None, u'log'), u'log')
self._logger.endDocument()
返回
如果 __name__ == "__main__":
#测试一下
导入系统
xl = xml_logger(sys.stdout, 'utf-8')
xl.write_entry(2, u"原版日志条目")
xl.close()
您可能想查看我从http://www.xml.com/pub/a/2003/03/12/py-xml.html获得的文章的其余部分。
于 2008-09-18T16:22:28.067 回答
2
于 2008-09-18T15:54:07.933 回答
0
几年前我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"info@centigrade.bogus") 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
于 2008-09-18T16:08:21.720 回答
-2
对 ElementTree 的第二次投票(cElementTree 是一个更快的 C 实现,例如 cPickle 与 pickle)。这里有一些简短的示例代码,您可以查看它以了解它是如何工作的:http ://effbot.org/zone/element-index.htm (这是 Fredrik Lundh,他首先编写了该模块. 太好了,它被 2.5 起草到标准库中 :-) )
于 2008-09-18T22:17:07.310 回答
-4
xml.etree.cElementTree,自 2.5 起包含在 CPython 的默认分发中。读取和写入 XML 速度极快。
于 2008-09-18T15:55:24.780 回答