WEB开发网
开发学院软件开发Python 使用 ElementTree,以 Python 语言处理 XML 阅读

使用 ElementTree,以 Python 语言处理 XML

 2007-03-29 12:11:28 来源:WEB开发网   
核心提示: 图 1. 以 Python 编写的 XML 对象模型的基准测试结果很明显,对于稍大一点的 XML 文档,使用 ElementTree,以 Python 语言处理 XML(3), xml.minidom很快就变得不实用了,其它则都还算合理(公正地说),当然,如果您确实只想要运行这一个任务,

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

很明显,对于稍大一点的 XML 文档, xml.minidom很快就变得不实用了。其它则都还算合理(公正地说)。 gnosis.xml.objectify消耗内存最少,但这并不奇怪,因为它不保存原始 XML 实例中 所有的信息(保存了数据内容,但不保存所有的结构信息)。

我也对 Ruby 的 REXML进行了测试,使用了以下脚本:

清单 2. Ruby REXML 解析脚本(time_rexml.rb)

require "rexml/document"
include REXML
doc = (Document.new File.new ARGV.shift).root

测试结果表明, REXML和 xml.minidom一样消耗大量资源:解析 Hamlet.xml 用了 10 秒,占用了 14 MB 内存;解析 Weblog.xml 用了 190 秒,占用了 150 MB 内存。显然,编程语言的选择通常优先于库的比较。

处理 XML 文档对象

ElementTree 的一个优点在于它能够被循环运行。这是指,您可以读入一个 XML 实例,修改数据结构使之非常类似于本机风格,然后调用 .write() 方法进行重新序列化得到格式良好的 XML。当然,DOM 也能做到这一点,但 gnosis.xml.objectify不行。为 gnosis.xml.objectify构造一个定制输出函数用于生成 XML 也不是 那么困难 - 但这不能自动进行。使用 ElementTree 以及 ElementTree 实例的 .write() 方法,通过便利函数 elementtree.ElementTree.dump() 可以序列化单独的 Element 实例。这让您可以从单独的对象节点 - 其中包括 XML 实例的根节点 - 编写 XML 片段。

我提出了一个简单的任务来比较 ElementTree 和 gnosis.xml.objectify 的 API。用于基准测试的大型文档 weblog.xml 包含大约 8,500 个 <entry> 元素,每个元素都含有相同的子字段集合 - 这是一个面向数据的 XML 文档的典型布局。在处理该文件时,任务之一可能是从每一个 entry 收集一些字段,但这只是在其它某些字段有特定值(或范围,或匹配的部分内容)的情况下。当然,如果您确实只想要运行这一个任务,可使用一个流 API(如 SAX)以避免在内存中为整个文档建模 - 但这里假定该任务是应用程序在大型数据结构上运行的任务之一。一个 <entry> 元素可能像这样:

上一页  1 2 3 4 5 6 7 8  下一页

Tags:使用 ElementTree Python

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接