|
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 的输出是相同的。
比较 清单 1 和清单 3。前者已经够简单了 —— 可是后者更加简单。它消除了明确地指定递归的需求。更重要的是,XPath 代码根据 XML(逻辑)标记,而不是结构。标记更接近于人的思维,并且持续时间长,从这个角度来看,结构是相对短暂的实现细节。通过使用更复杂的查询,XPath 的声明性样式与传统的面向结构的过程搜索实现相比,其优势更加明显。
本文的意义在于,能够把 XPath 融入到现有的 XML 程序开发中,并能立即获得性能和可维护性上的提高。对于我来说,这更像是在使用汇编程序、编译器、和更高阶的语言:我可以完全使用机器语言编写整个程序,但是学习高生产率的方法会简单划算。此外,XPath 通常能提高 手工编码的搜索的性能。
可是,这样却产生了一个问题:有方法改进 XPath 吗?是的,当然有 —— 但是有一些限定。XQuery 和 XSLT 是另外两种接受程度与 XPath 相当的 XML 定义(XSLT 可能是它们三者中使用最为广泛的,而 Xquery 的有用实现则最少)。在声明重点上 XSLT 与 XPath 类似,而 Xquery 在 XPath 的查询中加入了过程的功能。两者都能生成模板 —— 简要地说,嵌入可识别的 XML 代码段的查询 —— 或多或少符合语言习惯。这一点值得注重,因为一些 XML 理论家建议把模板作为理想的表示形式。
但是整体来说,相对于 XPath 产生的巨大效益而言,XQuery、XSLT 或此类特定于语言的查询包(如 Amara、XQJ、或JAXP)所带来的好处都是递增的。参考资料 中提供的 Uche Ogbuji 撰写的论文清楚地比较了采用各种不同方式解决的示例问题。只有在感觉 XML 处理相当复杂的时候,才使用这些更专业的接口。但是现在就开始使用 XPath!
|
| 共3页: 上一页 [1] 2 [3] 下一页 |
评论加载中…