级别: 初级
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博客 ” ,链接:http://blog.itpub.net/9496239/viewspace-925150/,如需转载,请注明出处,否则将追究法律责任。
<%if(items[i].items.items.length) { %>
<%}%> <%}%>
转载于:http://blog.itpub.net/9496239/viewspace-925150/