专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Python » elementtree:使用 ElementTree 以 Python 语言处理 XML »正文

elementtree:使用 ElementTree 以 Python 语言处理 XML

来源: 发布时间:星期四, 2009年1月8日 浏览:38次 评论:0
  Fredrik Lundh ElementTree 模块是种日益受欢迎 API用于以 Python 语言进行轻量级且高速 XML 文档操作在这篇专栏文章中David 将 ElementTree 和其它几种致力于以对象树方式处理 XML 例子尤其是他自己 gnosis.xml.objecty 模块作了个比照

  在本专栏以前文章中我已讨论了些 XML 库它们旨在以给定编程语言仿真最常见本机操作其中我首先介绍了我自己、用于 Python gnosis.xml.objecty 另外我也专门用了几篇文章介绍 Haskell HaXml 和 Ruby REXML 虽然我还未在这里讨论过但 Java JDOM和 Perl XML::Grove也有着类似目标

  最近我在 comp.lang.python 新闻组上注意到些帖子提到了 Fredrik Lundh ElementTree个用于 Python 本机 XML 库当然在 Python 标准分发版中早已包括了几个 XML API包括:DOM 模块、SAX 模块、 expat包装器和不赞成使用 xmllib其中只有 xml.dom将 XML 文档转换为内存中对象您可以通过节点上思路方法来操作这些对象实际上您将发现存在几种区别 Python DOM 实现其特性各有区别:

  xml.minidom是个基本实现

  xml.pulldom只在需要时构建被访问子树

  考虑到速度问题4Suite cDomlette( Ft.Xml.Domlette)用 C 语言构建 DOM 树避免了使用 Python 回调

  当然出于我身为作者自负我最想做是将 ElementTree和我自己 gnosis.xml.objecty及其它几种目和行为都极其接近库进行比较 ElementTree目标是以数据结构形式存储 XML 文档表示这些数据结构行为方式同您在 Python 中考虑数据方式非常相似这里关注焦点在于以 Python 进行编程而不是使您编程风格顺应 XML

  些基准测试

  我同事 Uche Ogbuji 曾为另个出版物写过篇有关 ElementTree短文(请参阅 参考资料)他对 ElementTree和 DOM 做了几个测试其中的比较了它们相对速度和内存消耗Uche 选用了他自己 cDomlette 作为比较对象很遗憾我不能在我使用 Mac OSX 机器上安装 4Suite 1.0a1(我正在研究种变通思路方法)然而我可以根据 Uche 评估来估计大致性能 - 他指出 ElementTree同 cDomlette相比速度慢 30%但消耗内存也要少 30%

  我极为好奇 ElementTree和 gnosis.xml.objecty在速度和内存上比较结果会如何实际上的前我从未对我模块进行过非常精确基准测试我始终没有个具体 可比对象我选择了两个过去我曾用于基准测试文档:莎士比亚 哈姆雷特289 KB XML 版本及 3 MB XML Web 日志我创建了几个脚本仅用于将 XML 文档解析为几种工具对象模型但此外不作任何其它操作:

  清单 1. 对用于 Python XML 对象模型计时脚本

% cat time_xo.py
    import sys
    from gnosis.xml.objecty
    import XML_Objecty,EXPAT
doc = XML_Objecty(sys.stdin,EXPAT).make_instance
---
% cat time_et.py
    import sys
    from elementtree
    import ElementTree
doc = ElementTree.parse(sys.stdin).getroot
---
% cat time_minidom.py
    import sys
    from xml.dom
    import minidom
doc = minidom.parse(sys.stdin)


  在所有 3个案例中对象创建非常类似对于 cDomlette 也我在另个窗口观察 top 输出以评估内存使用情况;每种测试进行 3遍以确保其致性并取其结果平均值(每次运行使用内存是相同)

  图 1. 以 Python 编写 XML 对象模型基准测试结果

  
>>> doc.text, doc.tail
('begin', None)
>>> doc.find('b').text, doc.find('b').tail
('inside', 'middle')
>>> doc.find('c').text, doc.find('c').tail
('inside', 'end')

  结束语

  ElementTree是个非常不错模块和 DOM 相比它提供了个更轻量级对象模型用于以 Python 处理 XML虽然我没有在本文中提及 ElementTree在从头生成 XML 文档方面和它在操作现有 XML 数据方面样出色

  作为和的类似库 gnosis.xml.objecty作者我无法完全客观地评价 ElementTree;尽管如此和那些 ElementTree所提供思路方法相比我始终尝试在 Python 中用我自己思路方法更简单自然地予以实现ElementTree 通常仍利用节点思路方法来操作数据结构而不是像人们通常处理应用中构建数据结构那样直接访问节点属性

  然而在有些方面 ElementTree很出色使用 XPath 访问深层嵌套元素要比手工递归搜索容易得多显然在 DOM 中也可使用 XPath但代价是形成个过于庞大且不够统 API ElementTree 所有 Element 节点工作方式是不像 DOM 节点类型那样“装饰华丽”

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: