xml读写:简化 XML 读写

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

  如果您很少使用 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())

  • 本文关键词:

最新评论

发表评论