XML 数据绑定框架 JiBX

作者:王恩建

申明:未经作者同意,谢绝转载。

XML 在现在 Java 应用的开发中,很多地方都能看到它的身影,比如最常见的是我们定义参数配置文件用的就是 XML 文件格式,避免程序的硬编码。当然,XML 的应用不仅限于此,在其他技术领域 XML 也占有举足轻重的位置。如何在 Java 中处理 XML 文件?目前最基础最底层的 API 是 DOM, SAX, JDOM, dom4j。这些 API 为 Java 处理 XML 提供了解决方案,但是不足的是他们使用方法复杂,在处理 XML 的时候很容易发生错误。记得在两年前使用 Cocoon 1.8 的时候,因为遗留系统采用 DOM 定义 XML 数据文件格式,大量的子元素、父元素、同级元素、属性让人好半天都没有理出头绪来。

这次我们介绍的 JiBX 是处理 XML 的高级 API,同类的项目还有 JAXB, Castor, Zeus。使用这类高级 API,在处理 XML 的使用,你的 Java 应用中将不再会有元素和属性,取而代之的是对象和值域。优点显而易见,处理 XML 的难度大大降低,而且更加符合面向对象的编程思想。

一 JiBX 简介

JiBX 是一个绑定 XML 数据到 Java 对象的框架。JiBX 用一个绑定定义文挡(binding definition document)来定义 XML 数据与 Java 对象转换的规则,这个文挡就是联系 XML 数据与 Java 对象之间的桥梁。

这里有必要先介绍两个数据绑定术语 marshal 和 unmarshal,marshal 是由 Java 对象生成 XML 文挡,unmarshal 是根据 XML 文挡建立 Java 对象。

使用 JiBX 的过程分成两个过程,一个是 binding compiler,另一个是 binding runtime。binding compiler 是一个前期准备过程,包括定义绑定定义文挡,定义与 XML 绑定在一起的 Java 对象,然后编译。在这个过程,JiBX 比其他项目在操作上要简单,不用定义 DTD 和 Schema,缺点是需要自己定义 Java 程序。binding runtime 是使用 binding compiler 编译好的 Java class 处理 XML 数据。

JiBX 也用到了第三方的工具XPP3 Pull Parser 和BCEL,在 JiBX 发布的文件中也包含了这两个工具相关的文件。

二 简单范例

按照惯例,还是从最简单的例子说起。

首先从 JiBX 网站下载 JiBX,当前最新版本是 beta 3。解开下载的 zip 文件,里面有一个 lib 目录,包含了 bcel.jar, jibx-bind.jar, jibx-extras.jar, jibx-run.jar, xpp3.jar 五个 jar 文件。bcel.jar, jibx-bind.jar 只有在 binding compiler 的时候才用得到。jibx-extras.jar 是一个可选的工具包,里面有一些测试和验证的工具类。

1.定义一个我们将要处理 XML 文件,文件名为 data.xml,内容如下:

123456789

John

Smith

12345 Happy Lane

Plunk

WA

98059

888.555.1234

这个 XML 文件非常简单,共有十个元素,没有属性。根元素 customer 有 person, street, city, state, zip, phone 六个子元素。其中元素 person 有 cust-num, first-name, last-name 三个子元素。

2.接着定义两个 Java 类 Customer 和 Person,也采用最简单的方式,用对象的域值对应元素,内容如下:

public class Customer {

public Person person;

public String street;

public String city;

public String state;

public Integer zip;

public String phone;

}

public class Person {

public int customerNumber;

public String firstName;

public String lastName;

}

这个两个类没有任何方法,够简单吧!或许你已经看出来了,Customer 类的七个 field 对应的是 XML 文件中 customer 元素的七个子元素。Person 类的三个 field 对应的是 person 元素的三个子元素。在 Person 类的 field 的名称并不是和 person 元素的子元素名称完全相等,这是遵守 Java 编程规范 field 命名的需要,虽然不相等,但这不重要,可以在绑定定义文挡中把它们一一对应起来。

3.绑定定义文挡

绑定定义文挡是依据绑定定义规范将 XML 数据和 Java 对象绑定的 XML 文挡。文件名为 binding.xml,内容如下:

binding.xml 文件中的 name 和 field 属性分别将 XML 中的元素和 Java 对象中的 field 一一对应并绑定起来。

mapping 元素的 name 和 class 属性将 customer 根元素和 Customer 类绑定在一起。

public Person person;

上面两行定义了 person 是 Customer 的 field,同时也把 person 元素和 person 类绑定在一起。

4.现在来看看他们之间的关系吧,如下图

图片来自Jibx 官方网站

对于最终用户来说,他们只知道 XML 数据文挡和 Java 类,而绑定定义文挡是透明的。

5.执行 Binding Compiler 过程

以下命令是在 Linux 下执行,如果是 Windows 平台请转换成相应的命令

#javac Person.java

#javac -classpath . Customer.java

#java -jar lib/jibx-bind.jar binding.xml

执行完后,在当前目录多了四个 class 文件,分别是 Person.class, Customer.class, JiBX_bindingCustomer_access.class, JiBX_bindingFactory.class。

6.执行 binding runtime 过程

首先定制一个 XML 数据文件 data.xml, 内容如下:

123456789

John

Smith

12345 Happy Lane

Plunk

WA

98059

888.555.1234

接着写一个简单的读取 data.xml 测试程序 Test.java,内容如下:

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import org.jibx.runtime.JiBXException;

import org.jibx.runtime.IBindingFactory;

import org.jibx.runtime.BindingDirectory;

import org.jibx.runtime.IUnmarshallingContext;

class Test {

public static void main(String[] args) {

try{

IBindingFactory bfact = BindingDirectory.getFactory(Customer.class);

IUnmarshallingContext uctx = bfact.createUnmarshallingContext();

Customer customer = (Customer)uctx.unmarshalDocument(new FileInputStream("data.xml"), null);

Person person = customer.person;

System.out.println("cust-num:" + person.customerNumber);

System.out.println("first-name:" + person.firstName);

System.out.println("last-name:" + person.lastName);

System.out.println("street:" + customer.street);

}catch(FileNotFoundException e){

System.out.println(e.toString());

}catch(JiBXException e){

System.out.println(e.toString());

}

}

}

编译并运行这个测试程序

#javac -classpath .:lib/jibx-run.jar Test.java

#java -cp .:lib/jibx-run.jar:lib/xpp3.jar Test

程序运行的结果是

cust-num:123456789

first-name:John

last-name:Smith

street:12345 Happy Lane

三 总结

总的来说,JiBX 就这么简单,不过 JiBX 还有一稍微复杂一点的应用,本文没有介绍,感兴趣的朋友可以继续研究下去。如果你有什么问题可以直接到我们的论坛http://www.sentom.net/forum 提出,也非常欢迎把你的经验给大家分享。

原作者:王恩建

来 源:http://www.sentom.net

共有1760位读者阅读过此文

作者:王恩建

申明:未经作者同意,谢绝转载。

XML 在现在 Java 应用的开发中,很多地方都能看到它的身影,比如最常见的是我们定义参数配置文件用的就是 XML 文件格式,避免程序的硬编码。当然,XML 的应用不仅限于此,在其他技术领域 XML 也占有举足轻重的位置。如何在 Java 中处理 XML 文件?目前最基础最底层的 API 是 DOM, SAX, JDOM, dom4j。这些 API 为 Java 处理 XML 提供了解决方案,但是不足的是他们使用方法复杂,在处理 XML 的时候很容易发生错误。记得在两年前使用 Cocoon 1.8 的时候,因为遗留系统采用 DOM 定义 XML 数据文件格式,大量的子元素、父元素、同级元素、属性让人好半天都没有理出头绪来。

这次我们介绍的 JiBX 是处理 XML 的高级 API,同类的项目还有 JAXB, Castor, Zeus。使用这类高级 API,在处理 XML 的使用,你的 Java 应用中将不再会有元素和属性,取而代之的是对象和值域。优点显而易见,处理 XML 的难度大大降低,而且更加符合面向对象的编程思想。

一 JiBX 简介

JiBX 是一个绑定 XML 数据到 Java 对象的框架。JiBX 用一个绑定定义文挡(binding definition document)来定义 XML 数据与 Java 对象转换的规则,这个文挡就是联系 XML 数据与 Java 对象之间的桥梁。

这里有必要先介绍两个数据绑定术语 marshal 和 unmarshal,marshal 是由 Java 对象生成 XML 文挡,unmarshal 是根据 XML 文挡建立 Java 对象。

使用 JiBX 的过程分成两个过程,一个是 binding compiler,另一个是 binding runtime。binding compiler 是一个前期准备过程,包括定义绑定定义文挡,定义与 XML 绑定在一起的 Java 对象,然后编译。在这个过程,JiBX 比其他项目在操作上要简单,不用定义 DTD 和 Schema,缺点是需要自己定义 Java 程序。binding runtime 是使用 binding compiler 编译好的 Java class 处理 XML 数据。

JiBX 也用到了第三方的工具XPP3 Pull Parser 和BCEL,在 JiBX 发布的文件中也包含了这两个工具相关的文件。

二 简单范例

按照惯例,还是从最简单的例子说起。

首先从 JiBX 网站下载 JiBX,当前最新版本是 beta 3。解开下载的 zip 文件,里面有一个 lib 目录,包含了 bcel.jar, jibx-bind.jar, jibx-extras.jar, jibx-run.jar, xpp3.jar 五个 jar 文件。bcel.jar, jibx-bind.jar 只有在 binding compiler 的时候才用得到。jibx-extras.jar 是一个可选的工具包,里面有一些测试和验证的工具类。

1.定义一个我们将要处理 XML 文件,文件名为 data.xml,内容如下:

123456789

John

Smith

12345 Happy Lane

Plunk

WA

98059

888.555.1234

这个 XML 文件非常简单,共有十个元素,没有属性。根元素 customer 有 person, street, city, state, zip, phone 六个子元素。其中元素 person 有 cust-num, first-name, last-name 三个子元素。

2.接着定义两个 Java 类 Customer 和 Person,也采用最简单的方式,用对象的域值对应元素,内容如下:

public class Customer {

public Person person;

public String street;

public String city;

public String state;

public Integer zip;

public String phone;

}

public class Person {

public int customerNumber;

public String firstName;

public String lastName;

}

这个两个类没有任何方法,够简单吧!或许你已经看出来了,Customer 类的七个 field 对应的是 XML 文件中 customer 元素的七个子元素。Person 类的三个 field 对应的是 person 元素的三个子元素。在 Person 类的 field 的名称并不是和 person 元素的子元素名称完全相等,这是遵守 Java 编程规范 field 命名的需要,虽然不相等,但这不重要,可以在绑定定义文挡中把它们一一对应起来。

3.绑定定义文挡

绑定定义文挡是依据绑定定义规范将 XML 数据和 Java 对象绑定的 XML 文挡。文件名为 binding.xml,内容如下:

binding.xml 文件中的 name 和 field 属性分别将 XML 中的元素和 Java 对象中的 field 一一对应并绑定起来。

mapping 元素的 name 和 class 属性将 customer 根元素和 Customer 类绑定在一起。

public Person person;

上面两行定义了 person 是 Customer 的 field,同时也把 person 元素和 person 类绑定在一起。

4.现在来看看他们之间的关系吧,如下图

图片来自Jibx 官方网站

对于最终用户来说,他们只知道 XML 数据文挡和 Java 类,而绑定定义文挡是透明的。

5.执行 Binding Compiler 过程

以下命令是在 Linux 下执行,如果是 Windows 平台请转换成相应的命令

#javac Person.java

#javac -classpath . Customer.java

#java -jar lib/jibx-bind.jar binding.xml

执行完后,在当前目录多了四个 class 文件,分别是 Person.class, Customer.class, JiBX_bindingCustomer_access.class, JiBX_bindingFactory.class。

6.执行 binding runtime 过程

首先定制一个 XML 数据文件 data.xml, 内容如下:

123456789

John

Smith

12345 Happy Lane

Plunk

WA

98059

888.555.1234

接着写一个简单的读取 data.xml 测试程序 Test.java,内容如下:

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import org.jibx.runtime.JiBXException;

import org.jibx.runtime.IBindingFactory;

import org.jibx.runtime.BindingDirectory;

import org.jibx.runtime.IUnmarshallingContext;

class Test {

public static void main(String[] args) {

try{

IBindingFactory bfact = BindingDirectory.getFactory(Customer.class);

IUnmarshallingContext uctx = bfact.createUnmarshallingContext();

Customer customer = (Customer)uctx.unmarshalDocument(new FileInputStream("data.xml"), null);

Person person = customer.person;

System.out.println("cust-num:" + person.customerNumber);

System.out.println("first-name:" + person.firstName);

System.out.println("last-name:" + person.lastName);

System.out.println("street:" + customer.street);

}catch(FileNotFoundException e){

System.out.println(e.toString());

}catch(JiBXException e){

System.out.println(e.toString());

}

}

}

编译并运行这个测试程序

#javac -classpath .:lib/jibx-run.jar Test.java

#java -cp .:lib/jibx-run.jar:lib/xpp3.jar Test

程序运行的结果是

cust-num:123456789

first-name:John

last-name:Smith

street:12345 Happy Lane

三 总结

总的来说,JiBX 就这么简单,不过 JiBX 还有一稍微复杂一点的应用,本文没有介绍,感兴趣的朋友可以继续研究下去。如果你有什么问题可以直接到我们的论坛http://www.sentom.net/forum 提出,也非常欢迎把你的经验给大家分享。

原作者:王恩建

来 源:http://www.sentom.net

共有1760位读者阅读过此文


相关文章

  • 学习资源的分类机制与分类标准的研究_吴砥
  • 实践探索 2009年1月 学习资源的分类机制与分类标准的研究 □吴砥 赵姝杨晓露张屹 Question and Test Inter-和问题测试互操作规范( 背景简介 信息化学习.教育和培训领域有浩如烟海的数字化学习资源,如何将这些资源分类 ...查看


  • android常见面试题
  • Android面试题班得瑞 (补充) 1.onCreate():当Activity被创建的时候调用(第一次).操作:设置布局文件,初始化视图,绑定数据文件等. 2.onStart():当Activity能被我们看到的时候. 3.onResu ...查看


  • 大唐电信java笔试题及答案
  • 1. Java如何实现多态,实现的主要方法. java是借助方法的重写和重载实现多态. 重载的特性,方法名相同.返回类型,传入方法的参数不同(包括个数和类型). 重写的特性,方法名相同,返回类型,参数均相同,必须发生在子类. 2. Hash ...查看


  • 软件开发课程设置
  • 软件工程--JAVA开发 课程概述 Java软件开发培训体系是针对在IT企业软件开发岗位专门设置的培训课程.此课程体系将重点讲授使用Java平台进行企业级软件开发所需的核心知识和技能,包括Jsp/struts前台框架技术,Jdbc/Hibe ...查看


  • 西安工业大学计算机专业毕业论文
  • 本科毕业设计(论文) 题目:基于WEB的软件工程案例教学平台 ----交互演示子系统的设计 院 (系): 专 业: 班 级: 学 生: 学 号: 指导教师: 2016年06月 本科毕业设计(论文) 题目:基于WEB的软件工程案例教学平台 - ...查看


  • JAVA复试问题答案
  • (一) JAVA复试的问题整理 1 Hibernate 的优化流程是如何实现的,流程是怎么样? 1. 尽量使用many-to-one ,避免使用单向one-to-many 象 2 Struts1与Struts2的区别? 在Action 实现 ...查看


  • 基于安卓的校园快递
  • 基于Android 的校园快递平台的设计与实现 摘 要:随着智能手机的普及以及移动互联网的快速发展,很多人尤其是在校大学生已经习惯于 使用手机应用来享受生活的便利.本文设计了一款基于Android 的校园快递平台,该平台可以方便快递人员进行 ...查看


  • 珠宝网站论文
  • 秦皇岛职业技术学院 设计题目: 学生姓名: 指导教师: 专业名称: 所在系院: 课程设计论文 珠宝网站 张杏 王志坚 王振勇 网络系统管理 信息工程系 2011年12月20日 前 言 互联网走到今天,也有一年的光景了,之间经历了高潮和低价, ...查看


  • 移动办公系统建设方案
  • 无锡市北塘区政府移动办公系统 建设方案 2014年11月 目 录 一. 项目概述 . ............................................................................. ...查看


热门内容