XML 和 Java 技术: 数据绑定的多种用法

80酷酷网    80kuku.com

  xml|数据

除将 XML 用作一种简单数据格式之外,数据绑定是 XML 最流行的用法之一。即使刚刚入门的程序员也能在一种原生编程语言中使用 XML,并且在大多数情况下完全不需要任何的 XML 专门知识。本文并不是介绍解决方案,取而代之,Brett 介绍了一些讨论主题,鼓励您思考如何使用 XML 和数据绑定。欢迎在 XML 和 Java 技术讨论论坛上与别人一起分享您的想法。

随着 XML 的日趋盛行,人们也越来越注重可用性。换句话说,程序员和管理者并不希望把 XML 看作是一项技术,拥有自己的语义和词汇结构,而认为它更像是纯粹的数据,访问时不用担心 XML 数据格式的细节。

完成 XML 从技术到业务格式的转换,最简单是方法就是数据绑定,这种说法还有待论证。数据绑定就是使用应用程序编程接口(Application Programming Interface,API)操作 XML 文档中的数据,这样程序员就不必过多地了解 XML,不必使用角括号,或者考虑 CDATA 部分或实体引用等等之类的事情。但即使是使用数据绑定,您也会发现在继续操作之前有大量的选项和重要问题需要仔细考虑。

出于本文讨论的目的,我将介绍两个与数据绑定相关的基本问题:

  1. 通过数据绑定 API 表示数据的方法。
  2. 当数据被视为业务数据时的用法。

在最普通的情况下,数据绑定就是将 XML 文档中的数据转换成正在使用的编程语言中的对象。

比方说,查看下面这段 XML 代码:

<person> <firstName>Brett</firstName> <lastName>McLaughlin</lastName> <email>brettnewInstance.com</email></person>

我们可以将这段代码转换成对象,比方说在 Java™ 代码中,这是一个 Person 类的实例,拥有成员变量 firstNamelastNameemail。实例应该包含代码段中的数据,并且能通过方法调用访问该数据,例如 myPerson.getFirstName() 方法。

尽管这是最常见的数据绑定方法,但是使用 XML 文档并把整个文档表示成一个对象的 API 也是数据绑定的一种形式。这些 API 包括文档对象模型(Document Object Model,DOM)、JDOM 和 dom4j,所有这些 API 都用于在 Java 编码中创建 XML 文档的对象模型。

在这些模型中,我们使用 rootElement.getChild("firstName").getValue() 之类的调用(或者与之相似的调用,取决于 API 的细节)。虽然这确实需要一些 XML 的基础知识(理解元素是什么以及文档的基本结构),但还是对程序员抽象了解析的细节。这就是数据绑定的本质:能够更多地注意到数据而不是数据显示的格式。

一旦采用了更普通的数据绑定解决方案,如 Sun's JAXB,那么需要注意的底层 XML 语法将会更少。可以真正完全地使用 Java(或者您偏好的编程语言)对象、方法和变量。即使是元素的细节和文档结构也隐藏在了数据绑定处理创建的对象之下。

但是,此处的关键是(经常没有考虑到的)仍然需要将 XML 数据结构与系统中的对象匹配,或者需要在系统中创建匹配所使用的 XML 数据格式的对象。这两种情况到 XML 的映射都不太明显,但它仍然是处理的一部分。

我在这里概述了两种基本的方法,但是这两种方法并不是像第一眼看上去那样区别很大。使用 DOM 或者 JDOM 之类的 API 时,不管是加载 XML 还是访问数据都需要不断地处理文档的结构。在第二种方法中,使用 JAXB 之类的 API 时,需要预先处理 XML,建立使用 XML 的对象模型(或者有时使用工具为您创建需要的类和对象)。然后,在运行时,将数据更多地作为业务数据来使用,可以不用考虑 XML 了。

如果 XML 不是非常易读的格式,或者并非如希望那样以业务目的分开,或者其格式会经常变化,则第一种方法将会是很好的选择。该方法需要更多一点的 XML 知识以及使用 API(更多地以技术为中心而不是以业务为中心)的能力。

另一方面,如果 XML 是按照业务需求组织的,并且 XML 结构很少变化,则可以一次性的创建类和对象,然后在运行时将数据作为业务数据使用,完全不用担心数据底层的 XML。


开发人员常常会疏于考虑:如何根据选择的数据绑定解决方案使用 XML 文档中的数据。但是,这可能是正确决定数据绑定方法的一个最重要的因素。

将 XML 数据转换成对象实例的数据绑定方法只适用于那些要多次使用的数据。获取 XML 文档中的数据并将其转换为多个对象中的成员变量数据涉及大量的处理工作。要从这个方法中获利,需要多次使用到该数据。

仔细查看一条数据的访问次数,同时也考虑一下使用了多少数据。比如说,假设 XML 中为每个人存储了 20 条数据,但应用程序中只访问了其中的一条,使用大量的资源转换数据却只是为了访问其中的一条。不论怎样计算这都不可能获利。

隐藏存储介质是使用基于对象的方法的另一个重要原因。因此应用程序中可能有一个组件对 Person 对象执行一些特殊的处理。可以从数据库或者 XML 文档或者属性文件中读取 people 数据,然后把这些数据转换成 Person 对象,再把这些对象传递给处理组件。

即使只是暂时使用数据,这也是用对象表示数据的一种很合理的情形。在本例中,如果将数据表示为对象格式,并且应用程序的其它部分已了解如何使用该格式,则可以获益。同时还避免了组件的数据转化和数据加载,而您只希望使用某种类型的对象来实现相应操作,这很好地实现了应用程序中的关系隔离,而它正是应该遵循的一条重要的设计原则(应用程序中的每个组件只实现一个功能,并实现好该功能)。

如果没有要重用的数据,而且不以对象的形式将数据传递给应用程序中的另一个组件,则可以考虑使用 DOM 或者 JDOM 之类的 API。这比将 XML 转换成非文档格式所使用的资源少,从而可以全面受益。此方法比以高昂的代价将数据转化为特定于业务的对象、以后却只使用该数据一二次要好得多。

尽管本文的主题是数据绑定,但有一点值得提到的是在这些情况下甚至可以考虑使用 SAX(Simple API for XML)这样的 API,它完全不提供对象模型(以文档或对象格式)。使用它处理 XML 只使用很少的内存和时间,如果确实只需要使用一条数据一到两次,则此方法可让您获益巨大。使用像 SAX 这样的 API 需要更多的了解 XML 的知识,但了解这些知识是非常值得的。

这篇关于XML 和 Java 技术 的系列文章不是提供问题的解决方案,而是希望能让读者自己思考如何使用一种特殊的技术和 API —— 本例讨论了 XML 和数据绑定。您可能会同意其中的某些观点,而不同意另外一些观点。但是应该明确的是,一定要更深入地思考如何在自己的应用程序中使用 XML。

本文旨在为读者提供一个起点。欢迎访问 XML 和 Java 技术论坛,在那里将以更加互动的形式继续这些讨论。如何使用数据绑定,您最喜欢使用哪一种 API,是否想出了数据绑定技术在应用程序中的一些创造性用法?请与我分享这些信息……我期待在网上与您进行交流




分享到
  • 微信分享
  • 新浪微博
  • QQ好友
  • QQ空间
点击: