【问题标题】:What's the easiest non-memory intensive way to output XML from Python?从 Python 输出 XML 的最简单的非内存密集型方法是什么?
【发布时间】:2008-09-18 15:42:19
【问题描述】:

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

【问题讨论】:

    标签: python xml streaming


    【解决方案1】:

    我想你会发现来自 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那里得到的文章的其余部分。

    【讨论】:

    • +1:这是这里唯一内置于 python 的流式答案。
    【解决方案2】:

    我想我中了你的毒药:

    http://sourceforge.net/projects/xmlite

    干杯

    【讨论】:

      【解决方案3】:

      几年前我从4suite使用MarkupWriter

      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 一起工作很开心。

      【讨论】:

      • 恐怕4suite已经不在线了。至于 lxml,它很棒,但没有 AFAIK 的 styreaming 设施。
      【解决方案4】:

      lxml 一直都取得了不错的成绩。安装起来很麻烦,因为它主要是对libxml2 的包装,但lxml.etree 树对象有一个.write() 方法,它接受一个类似文件的对象来流式传输。

      from lxml.etree import XML
      
      tree = XML('<root><a><b/></a></root>')
      tree.write(your_file_object)
      

      【讨论】:

        【解决方案5】:

        第二次投票给 ElementTree(cElementTree 是一个更快的 C 实现,例如 cPickle 与 pickle)。这里有一些简短的示例代码,您可以查看它们以了解其工作原理:http://effbot.org/zone/element-index.htm (这是 Fredrik Lundh,他首先编写了这个模块。太好了,它被 2.5 起草到标准库中:-))

        【讨论】:

          【解决方案6】:

          xml.etree.cElementTree,自 2.5 起包含在 CPython 的默认分发中。读取和写入 XML 速度极快。

          【讨论】:

          • 不过,cElementTree 不是流式编写器,因此将使用与您创建的 XML 树的大小成线性关系的内存,尽管比 xml.dom 少得多。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-23
          相关资源
          最近更新 更多