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 之前,让我们先了解一下 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 数据转换
海量数据处理(Huge Message Processing )
Smooks 能够支持对海量数据(GB 量级)的处理,例如拆分 (Split),转换 (Transform) 海量数据至数据分片 (message fragment) 以及路由 (Route) 这些数据分片至文件,数据库或者 JMS(Java Message Service)。
图 3. Smooks 海量数据处理
数据信息补充(Message Enrichment )
Smooks 可以利用数据库或者其他数据源,添加额外的信息至输入的数据中。例如在网络购物应用中可以将用户的偏好(preference)从数据库中添加到用户订单 中,以便为后续业务流程提供更多信息。
图 4. Smooks 数据信息补充
在提供了如此丰富的 XML 和 non-XML 数据转换功能的同时,Smooks 同时还提供了 Eclipse Smooks 插件以方便开发人员在 Eclipse 集成开发环境中开发和测试基于 Smooks 的数据转换应用 [7]。接下来,本文将以 Java 绑定 为例,结合 Smooks Eclipse 插件,较为详细的介绍如何在 Eclipse 中轻松完成设计、配置和测试基于 Smooks 的 XML 到 Java 对象的数据转换。