使用 Smooks Eclipse 插件轻松完成 XML 到 Java 的数据转换

Posted java架构之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用 Smooks Eclipse 插件轻松完成 XML 到 Java 的数据转换相关的知识,希望对你有一定的参考价值。

引言

XML (eXtensible Markup Language) 是 W3C 定义的一种用以描述结构化数据的元语言 (Meta Language)。由于 XML 的目标就是为了促进 Internet 中结构化文档的交换,因此其被设计为与具体编程语言、操作系统或传输协议无关的纯数据描述。正是由于 XML 的数据独立性,它的出现给分布式计算领域 (distributed computing) 带来了重大影响,并在 SOA(Service Oriented Architecture)和 Web 应用中得到了非常广泛的应用。

然而,在实际 SOA 应用的设计和开发中,考虑到组成系统的各个功能模块的异构性 (heterogeneity),例如:模块开发时间(新近开发 v.s 遗留系统),核心功能(Web Portal v.s 数据库),设计目标(性能 v.s 复用性)等等因素,不同的模块可能会使用除 XML 以外的不同数据描述和存储格式,这就需要开发人员在 XML 和 non-XML 格式之间进行数据转换。例如,许多商业系统采用 EDI(Electronic Data Interchange)标准进行数据交换,如果希望在 SOA 应用中整合此类现有系统,就需要完成 XML 和 EDI 格式之间的数据转换。与此类似,在网上购物系统的开发中,与用户交互的前端往往会使用 XML 存储用户或者商品的数据,而后端则需要对这些数据对象 (Object) 进行处理,诸如存储至数据库或者插入处理队列(如购物车)等操作,便捷和高效的 XML 到 Java 对象转换在这样的场合就能发挥巨大作用。

实际上,针对 XML 到 non-XML 格式的数据转换,当前已有一些工具,然而却或多或少在易用性或是功能全面性上不尽如人意。例如,XSLT(XSL Transformation) 可以帮助我们转换 XML 数据到 html 网页。但是,XSLT 并没有解决上面所提到的传统数据 ( 如 EDI,CSV) 与 XML 数据的互相转换;同时,编写 XSL 的转换模板,如果不是十分精通 XSLT 语法,往往需要耗费大量时间查阅手册。因此,一个设计良好、易于使用的 XML 到 non-XML 数据转换框架和引擎,就成为 SOA 应用开发中的重要工具。本文要介绍的 Smooks 就是这样一款拥有强大功能的 XML 和 non-XML 数据转换引擎。

Smooks 数据转换引擎

Smooks 是一款基于 LGPL 协议的开源 Java 框架,主要用于处理 XML 与 non-XML 格式 ( 包括 CSV,EDI,Java) 之间的转换。Smooks 于 2008 年 5 月发布 v1.0,目前最新的版本已是 v1.3.1。正如 Smooks 开发人员所言,“Smooks …让操作 XML, EDI,XML,CSV 变得更简单”。

实际上,我们通常将 Smooks 看做是一个 XML 到 non-XML 格式的“数据转换引擎”,然而在 Smooks 的核心实现中,本质上是为 XML, CSV, EDI 和 Java 等数据源提供了一个事件流(Event Stream),对数据源的处理其实可以看做是针对此输入数据流的一个个逻辑事件处理。因此,Smooks 的核心其实是一个“结构化数据事件流处理器”。在这样的设计中,开发人员可以用以下两种模式使用 Smooks:

  • 开发人员可以编写自己的逻辑事件处理器,用于定制化处理一个数据源事件流中的特定事件;

  • 开发人员也可以直接使用 Smooks 发行版中提供的解决方案(out-of-box solutions )。在这种模式下,开发人员只需重用别人创建的组件并重新配置它们来对数据源进行处理。例如,通过使用 Smooks 提供的组件便可完成从 XML 到 Java 对象的转换(正如本文下面将会展示的一样)

因此,在开始使用 Smooks 之前,让我们先了解一下 Smooks 发行版中已经提供了哪些数据转换功能。在 Smooks 的发行版中,主要包含了 4 大类也已实现的 XML 和 non-XML 数据转换组件 ,分别为:

Java 绑定 (Java binding)

Smooks 支持从多种数据源生成 Java 对象,包括从 CSV, EDI, XML 或 Java 等(如图 1 所示)。生成的 Java 对象既可以作为数据转换的结果进行使用,也可以成为另一个数据转的输入。

图 1. Smooks Java 绑定

数据格式转换(Transformation )

Smooks 支持多种数据格式之间的转换,包括:XML > XML, CSV > XML, EDI > XML, XML > EDI, XML > CSV, Java > XML, Java > EDI, Java > CSV, Java > Java, XML > Java, EDI > Java 等(图 2 )。

图 2. Smooks 数据转换

使用 Smooks Eclipse 插件轻松完成 XML 到 Java 的数据转换

海量数据处理(Huge Message Processing )

Smooks 能够支持对海量数据(GB 量级)的处理,例如拆分 (Split),转换 (Transform) 海量数据至数据分片 (message fragment) 以及路由 (Route) 这些数据分片至文件,数据库或者 JMS(Java Message Service)。

图 3. Smooks 海量数据处理

使用 Smooks Eclipse 插件轻松完成 XML 到 Java 的数据转换

数据信息补充(Message Enrichment )

Smooks 可以利用数据库或者其他数据源,添加额外的信息至输入的数据中。例如在网络购物应用中可以将用户的偏好(preference)从数据库中添加到用户订单中,以便为后续业务流程提供更多信息。

图 4. Smooks 数据信息补充

使用 Smooks Eclipse 插件轻松完成 XML 到 Java 的数据转换

在提供了如此丰富的 XML 和 non-XML 数据转换功能的同时,Smooks 同时还提供了 Eclipse Smooks 插件以方便开发人员在 Eclipse 集成开发环境中开发和测试基于 Smooks 的数据转换应用 [7]。接下来,本文将以 Java 绑定 为例,结合 Smooks Eclipse 插件,较为详细的介绍如何在 Eclipse 中轻松完成设计、配置和测试基于 Smooks 的 XML 到 Java 对象的数据转换。

基于 Smooks 的 Java 绑定

正如上文所提到的,Smooks 能够支持从多种源数据格式生成 Java 对象。然而,考虑到 JiBX 也能够完成从 XML 生成 Java 对象 [8],那么开发人员为什么要选择 Smooks 来完成类似任务呢?让我们选择 Smooks 的理由包括(或者说在下述这些场合 Smooks 更加适用):

  • Smooks 支持从 XML 和 non-XML 格式(如 EDI ,CSV 或 JSON )生成 Java 对象(甚至混合 XML 和 non-XML 源);而 JiBX 只支持从 XML 产生 Java 对象;

  • 当源数据仅有 XML 格式的数据,而缺少 XML Schema 的时候,Smooks 仍然能够完成从 XML 数据生成 Java 对象;而 JiBX 并不支持这个场景;

  • 由于 Smooks 不依赖于 Schema 文件,因此在数据源 XML 格式变化的情况下,Smooks 只需相应的修改从 XML 到 Java 对象的映射配置即可;而其他类似依赖于 Schema 的工具需要重新从 Schema 生成 Java 对象,重新编译并部署;

  • 如上文提到,Smooks 支持用户自定义逻辑事件处理器以达到在从 XML 生成 Java 对象的过程中加入定制处理的目的,从而具有良好的课扩展性(Extensibility );JiBX 并不支持类似的功能

如果所开发的项目符合上面的描述,那么选择 Smooks 来完成 Java 绑定,正如本文下面即将介绍的一样,将会是一次轻松和高效的开发体验。

本文接下来将利用一个简单的例子说明如何使用 Eclipse Smooks 插件的图形化界面轻松完成 XML to Java 绑定。读者在了解了 Smooks Eclipse 插件的使用方法之后,可以利用类似的方法完成 Smooks 所支持的其他数据转换功能。

利用 Smooks Eclipse 插件完成 Java 绑定

本文所使用的示例

在本文中,我们使用一个简单的网上购物系统的场景来说明如何使用 Smooks Eclipse 插件进行 Java 绑定 的开发。假设此网上购物系统的前端将用户的订单都按照清单 1 中的 XML 格式进行存储,然后传给后台处理模块。我们希望使用 Smooks 来完成从此 XML 文件生成相应的 Java 对象以便进行后续的处理。

清单 1. 数据源 XML 文件


<? xml version = "1.0" encoding = "ISO-8859-1" ?>

以上是关于使用 Smooks Eclipse 插件轻松完成 XML 到 Java 的数据转换的主要内容,如果未能解决你的问题,请参考以下文章

Eclipse安装代码反编译插件Enhanced Class Decompiler

善用ADT Bundle,轻松邂逅女神

使用 SMOOKS 生成 EDI 文件

java中搜索插件叫啥

netty 编解码器与 smooks 编组

如何使用 TFS(Team Explorer Everywhere)插件更正与 Eclipse 上的代码完成相关的错误?

(c)2006-2024 SYSTEM All Rights Reserved IT常识