TopLink 对象至 XML 映射简介
作者:Blaise Doughan
对象至 XML 阻抗不匹配
XML 是一个通用的数据交换格式。 XML 容易理解并且可移植,这使它成为用于在不同平台上运行的应用程序(例如,Web 服务)之间交换数据的完美格式。
但对许多应用程序而言,对象(而非 XML)是首选的编程表示方法。 XML 已经在现代软件领域中得到普遍使用,因此要在对象级工作,必须将数据转换为对象形式。 与人们所熟知的对象关系阻抗不匹配相似,对象与 XML 也存在类似的不匹配。
为什么不仅仅使用 DOM、SAX 或 StAX?
这些 API 只提供了对 XML 数据的低级访问,而许多应用程序需要更高级别的对象抽象。 尽管 DOM 提供了一个可以浏览的内存中树结构,但这些对象并非开发人员习惯处理的域对象。
本示例介绍了一个小模式片段,以演示在与 XML 进行直接交互时需要留意的事项。 当使用大型文档时,这些类型的问题导致访问 XML 数据的代码比较复杂和琐碎。
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="urn:customer-example" targetNamespace="urn:customer-example" elementFormDefault="unqualified"> <xs:element name="customer"> <xs:complexType> <xs:sequence> <xs:element name="personal-info"> <xs:complexType> <xs:sequence> <xs:element name="first-name" type="xs:string"/> ... <xs:element name="date-of-birth" type="xs:date"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element ref="contact-info"/> </xs:sequence> </xs:complexType> </xs:element> ... </xs:schema>
在本示例中,我们需要了解 XML 模式的一些详细信息,以检索名字数据。 首先,我们需要访问 first-name 元素,该元素嵌套在 personal-info 元素(嵌套在 customer 元素的之下)之下。 无法从 XML 文档中获取此信息。 此外,我们还需要知道 date-of-birth 元素的类型为 XML 模式日期。 这意味着我们从 XML 分析器中返回的字符串将为下面的 yyyy-mm-dd(年-月-日)格式。 然后,我们可以使用该信息将 String(字符串)正确转换为 java.util.Calendar。
还有一些 XML 模式规则也需要留意。 在以上显示的 XML 模式片段中,elementFormDefault 属性设置为“unqualified”并设置了一个目标命名空间。 这意味着全局声明的元素必须是命名空间限定的,而局部声明的元素不得为命名空间限定的。
低级分析器 API 使用起来比较烦琐,并将应用程序代码与 XML 模式详细信息偶合在一起。 如果对模式进行任何更改,则此代码将难以维护。
JAXB 怎么样呢?
JAXB 允许用户使用类似域的对象与 XML 进行交互。 与 DOM 对象不同,JAXB 内容模型使您可以根据 XML 模式深入了解 XML 文档。 如果 XML 模式定义了包含客户信息的 XML 文档,您将在内容模型中看到类似 Customer、Address 和 PhoneNumber 这样的对象,这些对象反映了 XML 模式中的相应类型。 为 XML 模式中存在的每个类型生成一个类。
使用对象形式的 XML 对象,浏览数据结构变得更为容易,您可以发现内容类包含的属性并相应地浏览它们。 内容模型还使用 XML 数据规范中的规则转换为 Java 中的相应类型,从而解决了类型问题。 JAXB 隐藏了许多 XML 模式规则。 用于处理命名空间限定等事物的逻辑封装在由 JAXB 编译器生成的产物中。
但在使用 JAXB 时有几个限制。 使用 JAXB,您必须从 XML 模式开始。 XML 模式是 JAXB 编译器的输入,基于规范将输出一系列模型类。 生成的内容类只能用于生成符合单个 XML 模式的文档,必须为每个 XML 表示生成一个新的 JAXB 内容模型。
如果对 XML 模式进行更改,则需要重新生成相应的内容类。 由于这些内容需要更新,因此这将影响每个使用这些内容类的应用程序。 现有 Java 类无法与 JAXB 一起使用以表示模式,只能使用生成的类,且这些类无法更改。
尽管 JAXB 要比标准 XML API 更易于使用,但还有更好、更灵活的方法与 XML 数据进行交互。
TopLink 的对象至 XML 功能简介
TopLink 在它的对象至 XML 支持中包含了 JAXB 1.0 实现,但使用 TopLink,您所能做的事情将是使用 JAXB 不可企及的。 TopLink 支持将现有 Java 对象映射为 XML。 这些映射使用与 TopLink 的对象到关系映射相似的规则。 可以使用一个名称为 TopLink 映射工作平台的可视化映射编辑器创建和自定义这些映射。 TopLink 为开发人员提供了最大限度的灵活性,使他们可以控制如何将对象模型映射为 XML 模式。
控制您自己的对象模型有许多优点:
TopLink 的一个主要优点是映射信息存储在外部,并且不需要对 Java 类或 XML 模式进行任何更改。 这意味着您可以将域对象映射到多个模式,或者如果您的模式更改,则只需更新映射元数据,而不必修改您的域类。
TopLink JAXB 编译器生成的对象在本质上是 POJO,唯一的差别是他们实现 JAXB 规范所需的必要接口。 TopLink JAXB 编译器生成元数据,这些元数据允许使用 TopLink 映射控制台自定义生成的类和映射。 即使对于自定义映射,仍可以使用 JAXB 运行时 API 对对象进行编组和取消编组
基本的概念是类映射为复杂类型,对象关系映射为 XML 元素,而简单的属性映射为文本节点和 XML 属性。 真正的功能是将对象属性映射为 XML 文档时,使用 XPath 语句指定 XML 数据的位置。 以下是一个有关如何使用此语句的示例。
此示例在映射中使用了 XPath 语句,这样使得我们可以不用将对象映射为 personal-info 元素。
在此示例中,XPath 包含位置信息,这使用户可以根据它在文档中的位置设置元素的重要性。 TopLink 还支持使用与 Java 集合中相同的名称存储元素中的值。
这里主要展示了 TopLink 提供的七个映射之一,这七个映射以及三个数据转换程序插件为 XML 数据的处理提供了极大的灵活性和效率。
摘要和后续步骤
TopLink 提供了强大和灵活的对象至 XML 功能,这些功能是对许多人已经熟悉的现有对象关系映射的补充。 尽管 TopLink 的功能已经远远超出了 JAXB 1.0,为开发人员提供了丰富的对象级编程环境以处理 XML 数据,但请注意,TopLink 兼容 JAXB,这一点很重要。 许多增值特性被提议作为 JAXB 2.0 JSR 222(作者是 JAXB 2.0 JSR 222 专家委员会的成员)的一部分。
对象至 XML 功能包含在 TopLink 10.1.3 中,最新的开发人员预览版的下载链接如下:
/technology/global/cn/products/ias/toplink/preview/10.1.3dp4/howto/index.html
如果要查找有关 TopLink OXM 功能的更多信息,以下页面提供了一个完整概述,包括试用我们的示例以及如何创建对象至 XML 映射的分步指南:
TopLink 的基础示例中包含两个 TopLink OXM 示例。 第一个示例演示了 TopLink 的 JAXB 1.0 支持,第二个示例演示了如何使用新的对象至 XML 映射将现有对象模型映射为 XML 模式。
http://www.oracle.com/technology/products/ias/toplink/preview/10.1.3dp4/examples/index.html
了解如何将 Oracle TopLink 用作 Web 服务的定制串行化机制。
作者介绍
Blaise Doughan 是一位高级软件工程师,并且是 TopLink 的 OXM 项目的团队领导。 他是 JSR 222 JAXB 2.0 专家委员会的成员。