16

基本上,类似于 System.Xml.XmlWriter - 一种不会产生太多内存开销的流式 XML 编写器。这样就排除了 xml.dom 和 xml.dom.minidom。建议?

4

6 回答 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

我想我有你的毒药:

http://sourceforge.net/projects/xmlite

干杯

于 2008-09-18T15:54:07.933 回答
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"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

最近我听到很多关于lxml的伟大之处,但我没有第一手经验,而且我在使用gnosis时获得了一些乐趣。

于 2008-09-18T16:08:21.720 回答
-1

我总是用lxml取得好成绩。安装起来很痛苦,因为它主要是libxml2的包装器,但是lxml.etree 树对象有一个.write()方法可以接收一个类似文件的对象来流式传输。

from lxml.etree import XML

tree = XML('<root><a><b/></a></root>')
tree.write(your_file_object)
于 2008-09-18T15:57:23.837 回答
-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 回答