引言:

  Smooks是一个开源的Java框架,用于处理“数据事件流”。它常常被认为是一个转换框架并以此被用于好几个产品和项目中,包括JBoss ESB(以及其它ESB)。然而究其核心,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:

  1. 多源数据格式:“轻易”地消费诸多流行的数据格式,包括XML,EDI,CSV,JSON和Java(是的,你可以以一种声明性的方式完成java到java的转换)。
  2. 转换:利用诸多选项消费由数据源产生的事件流,产生其它格式的结果(即,对源进行“转换”)。这包括能在过滤源数据流时对Smooks所捕获的数据模型应用FreeMarker和XSL模板。鉴于这些模板资源能被运用于源数据事件流内部的事件,因此它们能被用来执行“基于片断的转换(fragment based transforms)”。这意味着Smooks能被用于对数据源的片断执行转换,而不仅限于将数据源作为一个整体来施行转换。
  3. Java绑定:以一种标准方式由所支持的数据格式(即不仅限于XML)创建和生成Java对象模型/图。由EDI数据源 生成某对象模型的配置与由XML数据源或JSON数据源生成对象模型所进行的配置几乎一模一样。唯一区别在于绑定配置的“事件选择器(event selector)”取值不同。
  4. 大型消息处理:Smooks支持多种处理大型消息(GBs)的方式,它是通过基于SAX的过滤器完成的。由于综合了 基于片断转换、Java绑定,以及使用节点模型混合DOM和SAX模型所带来的能力,Smooks可以使用较低的内存空间处理大型消息。这些能力允许你执 行直接的1对1转换,同时也支持对大型消息数据流执行1对多的分解、转换和路由。
  5. 消息修饰:使用数据库数据修饰消息。这可以按片断来完成,即你可以按片断来管理在一个片断上的修饰。与此相关的一个用例是一个包含了消费者ID列表的消息在发往另一个流程前需要从数据库提取消费者地址和概要数据来丰富。
  6. 基于可扩展XSD的配置模型:从Smooks v1.1开始,你可以用自己的可重用定制访问者逻辑配置模型来扩展Smooks XSD配置名字空间。创建这些定制配置扩展只是一项简单的配置工作,这个工作极大的增进了这些重用组件的可用性。所有的现有Smooks预置组件都利用了这一工具。

Java-to-XML实例:

  工具:Eclipse,Smooks

  这里采用的是Smooks自带的java-to-xml实例(example文件夹下):

  首先,需要做的是在Eclipse中安装Smooks插件。

  1. 打开Eclipse,点击【Help】-【Install New SoftWare...】-【add】:

    Name只可以随意设置,Location设置访问【http://download.jboss.org/jbosstools/updates/】,自己选择要用的版本,我这里使用的是【http://download.jboss.org/jbosstools/updates/JBossTools-3.1.1.GA/】

  2. 设置成功后,选择【Data Services】-【Smooks Tools】,点击【next】,完成安装

  然后,编写.xml文件,新建xml源文件夹

  Orders.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
2 <order>
3 <header>
4 <date>Wed Nov 15 13:45:28</date>
5 <customer number = "123321">Fx</customer>
6 </header>
7 <order-items>
8 <order-item>
9 <product>111</product>
10 <quantity>2</quantity>
11 <price>100</price>
12 </order-item>
13 <order-item>
14 <product>222</product>
15 <quantity>3</quantity>
16 <price>200</price>
17 </order-item>
18 </order-items>
19 </order>

接下里,编写目标Java文件:

Header.java

 package com.fx.java;

 public class Header {
private String date;
private String customerNumber;
private String customerName; public Header(){
date = null;
customerNumber = null;
customerName = null;
} public Header(String data, String customerNumber, String customerName) {
this.date = data;
this.customerNumber = customerNumber;
this.customerName = customerName;
} public String getDate() {
return date;
} public void setDate(String date) {
this.date = date;
} public String getCustomerNumber() {
return customerNumber;
} public void setCustomerNumber(String customerNumber) {
this.customerNumber = customerNumber;
} public String getCustomerName() {
return customerName;
} public void setCustomerName(String customerName) {
this.customerName = customerName;
} }

  OrderItem.java

 package com.fx.java;

 public class OrderItem {

     private String productId;
private String quantity;
private String price; public OrderItem() {
productId = null;
quantity = null;
price = null;
} public OrderItem(String productId, String quantity, String price) {
this.productId = productId;
this.quantity = quantity;
this.price = price;
} public String getProductId() {
return productId;
} public void setProductId(String productId) {
this.productId = productId;
} public String getQuantity() {
return quantity;
} public void setQuantity(String quantity) {
this.quantity = quantity;
} public String getPrice() {
return price;
} public void setPrice(String price) {
this.price = price;
} }

  Order.java

 package com.fx.java;

 import java.util.Vector;

 public class Order {
public Header header;
public Vector<OrderItem> orderItems; public Order(){
header = new Header();
orderItems = new Vector<OrderItem>();
} public void setHeader(Header header) {
this.header = header;
} public void setOrderItems(OrderItem orderItems) {
this.orderItems.add(orderItems);
} }

  接下来,进行作重要的一步:配置Smooks完成xml到 Java对象的映射:

  新建一个 Smooks 配置文件:File > New > Smooks > Smooks Configuration File,选择刚才创建的 Java Project 的 src 文件夹作为 Smooks 配置文件的父目录,保留缺省的文件名 smooks-config.xml,单击 Finish 生成初始的配置文件。此时在 Smooks Processing 编辑器中只有一个 Input Task 图标。

  

  单击 Input Task 图标,则可以看到 Smooks input reader 的属性配置界面。由于我们希望完成从 XML 到 Java 的绑定,因此在 Input Type 的下拉菜单中选择“Input Type”为 XML。接下来,在配置界面右侧的 Input Data 中单击 Add 将源 XML 文件添加到项目中。Smooks 会自动解析此 XML 文件并在 Input Model View 中列出其数据模型。

  

  在完成了源数据导入之后,我们要开始配置 Java 绑定。将鼠标移至 Input Task 的蓝色箭头右侧,将会有一个绿色加号(+)出现,单击此加号并选择出现的提示“Java 映射;为了将开发的 Java 类导入 Smooks 配置,在 Selected Task Details 配置框中空白处单击鼠标右键,选择 Add > Java Class,将上文中开发的 Header,OrderItem 以及 Order 类导入。然后就可以非常方便的使用拖曳的方式在左边的 XML 数据模型和右边的 Java 类和成员变量之间建立映射关系,最后的结果如下图所示:

  

  xml表现形式为:

  smooks-config.xml

 <?xml version="1.0" encoding="ASCII"?><smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd" xmlns:jb="http://www.milyn.org/xsd/smooks/javabean-1.2.xsd">
<params>
<param name="stream.filter.type">SAX</param>
<param name="inputType">input.xml</param>
<param name="input.xml" type="input.type.actived">Workspace://smooks xml-to-java/xml/Orders.xml</param>
</params>
<jb:bean beanId="Header" class="com.fx.java.Header" createOnElement="/order/header">
<jb:value data="/order/header/customer" property="customerName"/>
<jb:value data="/order/header/customer/@number" property="customerNumber"/>
<jb:value data="/order/header/date" property="date"/>
</jb:bean>
<jb:bean beanId="OrderItem" class="com.fx.java.OrderItem" createOnElement="/order/order-items/order-item">
<jb:value data="/order/order-items/order-item/price" property="price"/>
<jb:value data="/order/order-items/order-item/product" property="productId"/>
<jb:value data="/order/order-items/order-item/quantity" property="quantity"/>
</jb:bean>
<jb:bean beanId="Order" class="com.fx.java.Order" createOnElement="order"/>
</smooks-resource-list>

  最后,进行测试(要记得导入Smooks所需要的架包,将下载下来的Smooks版本的lib文件夹下的所有架包全部导进来):

  TestSmooks.java

 package com.fx.test;

 import java.io.FileInputStream;
import java.io.IOException;
import javax.xml.transform.stream.StreamSource;
import org.milyn.Smooks;
import org.milyn.payload.JavaResult;
import org.xml.sax.SAXException;
import com.fx.java.Header;
import com.fx.java.OrderItem; public class TestSmooks { public static void main(String[] args) throws IOException, SAXException {
Smooks smooks = new Smooks("smooks-config.xml");
JavaResult javaResult = new JavaResult(); smooks.filterSource(new StreamSource(new FileInputStream("F:\\Users\\FANXUAN\\JunoWorkSpace\\smooks xml-to-java\\xml\\Orders.xml")), javaResult);
Header header = (Header)javaResult.getBean("Header");
OrderItem orderItem = (OrderItem)javaResult.getBean("OrderItem"); System.out.println("--->" + header.getCustomerNumber());
System.out.println("--->" + header.getCustomerName());
System.out.println();
System.out.println("--->" + orderItem.getProductId());
System.out.println("--->" + orderItem.getQuantity());
System.out.println("--->" + orderItem.getPrice());
} }

  运行得到结果:

  

  由此,我们完成了xml到java转换的配置和测试!

  

Smooks:xml-to-java的更多相关文章

  1. nested exception is java.lang.RuntimeException: Error parsing Mapper XML. Cause: java.lang.IllegalArgumentException: Result Maps collection already contains value for

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'daoSupport': ...

  2. xml 解析 java 基础复习

    document  解析 sax  解析 dom4j 解析(摘自csdn redarmychen) dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个非常 ...

  3. 使用xml及java代码混合的方式来设置图形界面

    参考<疯狂android讲义>第2版2.1节 设置android的图形界面有三种方法: 1.使用纯xml文件 2.使用纯java,代码臃肿复杂,不建议使用 3.使用xml与java混合,前 ...

  4. spring mybatis 整合问题Error parsing Mapper XML. Cause: java.lang.NullPointerException

    14:30:40,872 DEBUG SqlSessionFactoryBean:431 - Parsed configuration file: 'class path resource [myba ...

  5. Spring 与 mybatis整合 Error parsing Mapper XML. Cause: java.lang.NullPointerException

    mapper配置文件中的namespace没有填:而且namespase的值应该填为:mapper的权限定名:否则还是会抛出异常 org.springframework.beans.factory.B ...

  6. POPTEST老李分享DOM解析XML之java

    POPTEST老李分享DOM解析XML之java   Java提供了两种XML解析器:树型解释器DOM(Document Object Model,文档对象模型),和流机制解析器SAX(Simple ...

  7. 使用XStream是实现XML与Java对象的转换(3)--注解

    六.使用注解(Annotation) 总是使用XStream对象的别名方法和注册转换器,会让人感到非常的乏味,又会产生很多重复性代码,于是我们可以使用注解的方式来配置要序列化的POJO对象. 1,最基 ...

  8. XML 和 java对象相互转换

    XML 和 java对象相互转换 博客分类: XML 和 JSON   下面使用的是JDK自带的类,没有引用任何第三方jar包. Unmarshaller 类使客户端应用程序能够将 XML 数据转换为 ...

  9. xml和java对象互转:JAXB注解的使用详解

    先看工具类: import org.slf4j.Logger; import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; ...

  10. mybatis_generator合并xml和Java

    之前写了合并xml的插件,今天改了改mybatis-generator源码,合并java和xml都改进去了. 先上图吧. 左边是一开始生成的,中间去掉author加了password字段和方法,右边重 ...

随机推荐

  1. 四边形不等式优化DP——石子合并问题 学习笔记

    好方啊马上就要区域赛了连DP都不会QAQ 毛子青<动态规划算法的优化技巧>论文里面提到了一类问题:石子合并. n堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的 ...

  2. python入门课程 第3章 Python变量和数据类型

    第3章 Python变量和数据类型3-1 Python中数据类型计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形 ...

  3. 第5章 网页下载器和urllib2模块

    网页下载器:将互联网上URL对应的网页下载到本地的工具 通过网页下载器将互联网中的url网页,存储到本地或内存字符串 python有哪几种网页下载器? 1.urllib2  python官方基础模块 ...

  4. SQL SERVER 2008查看sql执行的时间

    set statistics profile onset statistics io onset statistics time ongo<这里写上你的语句...>goset statis ...

  5. java Web程序使用wro4j合并、压缩js、css等静态资源

    在Web项目中,js.css合并压缩,不仅有利于减少Http请求数量.减少宽带资源占用,还能有效的管理各种js.css的引入,使整个项目更加有序.而对于访问用户来说,其更大的好处是增加了页面的打开速度 ...

  6. [note]最近公共祖先

    最近公共祖先(LCA)https://www.luogu.org/problemnew/show/P3379 #define RG register #include<cstdio> #i ...

  7. Notification状态栏显示信息

    Notification即通知,用于在通知栏显示提示信息. 在API Level > 11,Notification类中的一些方法被Android声明deprecated(弃用),而在API L ...

  8. 解决ajax get方式提交中文参数乱码问题

    最近在工作中遇到,使用ajax get方式提交中文参数的时候出现乱码,通过上网搜索,总结出比较简单的两种解决方案: 第一种,由于tomcat默认的字符集是ISO-8859-1,修改Tomcat中的se ...

  9. activiti基础--0------------------------------生成23张表

    1.工作流activiti.cfg.xml配置文件 <beans xmlns="http://www.springframework.org/schema/beans" xm ...

  10. linux sort按照指定列排序

    sort怎样按指定的列排序0000 27189 41925425065f 15 419254250663 7 419254250675 5 419254250691 76 419254250693 2 ...