ITPub博客

首页 > 应用开发 > IT综合 > 简化 XML 读写(转载CSDN)

简化 XML 读写(转载CSDN)

原创 IT综合 作者:haoweiguang 时间:2007-07-08 10:07:07 0 删除 编辑

级别: 初级

Cameron Laird (claird@phaseit.net), 副总裁, Phaseit, Inc.

2007 年 7 月 02 日

合理使用 XML,XPath 就能够显著地简化和加速应用程序。如果您的工具包中还没有 XPath,那么现在就把它添加进来吧。使用 Python 简要编写的具体示例使查询习语的出现更为自然。

XPath 理应成为您的朋友。

如果您很少使用 XML 进行开发,并且从未使用过 XPath,那么您将有机会开发性能更强、可维护性更佳的应用程序。这篇文章详细介绍了一些特定的示例,用来演示在简单的 XML 处理中,查询方法能够造成多大的影响。

基础知识

要确保 XPath 进展顺利,需考虑一些基础原理:

  • 下列示例使用 Python 编写

  • 以前您可能多次听说 Xsomething 很有用 —— 它设计用于解决特定的和实际的问题,它经过委员会的一致通过,等等。我承认我就听说过。虽然 XPath 与 XML 中所有其他的 Alphabet Soup 不同;但是它确实是 非常有用的工具。对于实际投身编程工作的程序员来说,XPath 是最具学习价值的 XML 定义之一,其重要性仅次于 XML 本身和 XHTML。

  • 您不需要 XPath。您是一名实际动手编程的 XML 程序员,您的应用程序已经具备了所需的功能。可是关键在于,传统的过程编程不能很好地解决常见的 XML 问题。虽然程序能正确地运行,但是只需少量的查询代码就能使您的程序具有更好的可读性、更易于维护,并且在很多情况下,运行得更快,有时这种效果非常明显。使用这些代码的目的不是要抛弃现有的正常运作的编程方法,而是要学习一些辅助技巧,使用这些技巧可取得立杆见影的效果。

developerWork 上 XML 专区的读者大多致力于 C、C++、或 Java 开发。但 Python Python 是一种很值得展示的工具,因为它读起来像流线型的伪代码,并且广泛可用。即便是 Python 的初学者也能理解后继的用法。

类似于许多其他语言,Python 支持大量的 XML 库。过去常常会不知道从何处开始。然而,随着 Python 2.5 版本的推出,Fredrik Lundh 的非凡的 ElementTree 模块成为了标准;本文的示例将使用这个库。库本身很小,并能附加到任何 1.5.2 以上的 Python 版本中,参考资料 中对此作出了解释。正确安置好 ElementTree 后,执行示例程序所需的一切条件都已就绪。

XML 编程模型

目前大多数 XML 编程都是基于文档对象模型(Document Object Model,DOM )。这一模型将 XML 实例视为一个元素树,使用标记对元素进行标识,很多元素都有属性和/或子元素。XML 编程是一项繁重的工作,因为处理必须通过树导航到各个元素。例如,考虑 developerWorks 在开发 developerWorks 文章的内容的过程中所使用的模板 XML 。这看上去与 XHTML 极为相似。它的模式简单易懂,这当然是与工业应用程序(可能是用于采集机器或财务事项的众多细节)中常见的 XML 实例相比而言。即便是使用这个简单的模型,如果您想要报告文本中的所有锚点标记 —— 所有标记为 的元素 —— 那么您需要导航整个文档,到一个任意的嵌套深度。简单的非递归过程表达式并不能访问所有的元素,尽管许多库都包含有帮助功能,可以用于遍历树。

结果:用于报告所有锚点的一个简单的程序将类似于: 清单 1. 基于 DOM 的代码,用于报告所有的锚点

import elementtree.ElementTree

def detail_anchor(element):

if element.tag == "a":

attributes = element.attrib

if "href" in attributes.keys():

print "'%s' is at URL '%s'." % (element.text,

attributes['href'])

if "name" in attributes.keys():

print "'%s' anchors '%s'." % (element.text,

attributes['name'])

def report(element):

detail_anchor(element)

for x in element.getchildren():

report(x)

report(elementtree.ElementTree.parse("draft2.xml").getroot())

使用下面描述的 5.5.1 引用模板,将产生类似如下的输出: 清单 2. 清单 1 中的程序产生的报告

'related developerWorks content' is at 'http://www.ibm.com/developerworks'.

'entire series' is at 'http://www.ibm.com/...'

...

'IBM product evaluation versions' is at 'http://www.ibm.com/...'

如果有一种标准的方法可用来查询 DOM 实例、解压指定元素、属性和标记的信息,那么可带来多大的简化?您自己看吧:

清单 3. 基于 XPath 的与清单 1 等价的代码。

import elementtree.ElementTree

def detail_anchor(element):

if element.tag == "a":

attributes = element.attrib

if "href" in attributes.keys():

print "'%s' is at URL '%s'." % (element.text,

attributes['href'])

if "name" in attributes.keys():

print "'%s' anchors '%s'." % (element.text,

attributes['name'])

for element in

elementtree.ElementTree.parse("draft2.xml").findall("//a"):

detail_anchor(element)

清注意,“//a” 在英语中的意思是 “在整个文档中搜索标记为 ‘a’ 的元素”。从本质上说,清单 3 产生的输出与 清单 2 的输出是相同的。

ElementTree 安装

我们希望 Python 的安装附有ElementTree。虽然大家会乐意阅读代码清单,但如果能亲自执行代码则更好,而根据自己的想法对代码

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9496239/viewspace-925150/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论