JiBX 简介
JiBX 是一个绑定 XML 数据到 Java 对象的框架。JiBX 用一个绑定定义文挡(binding definition document)来定义 XML 数据与 Java 对象转换的规则(binding.xml),这个文挡就是联系 XML 数据与 Java 对象之间的桥梁。
官网文档地址: http://jibx.sourceforge.net/index.html
使用 JiBX 的过程分成两个过程,一个是 binding compiler,另一个是 binding runtime。
binding compiler
是一个前期准备过程,包括定义绑定定义文挡,定义与 XML 绑定在一起的 Java 对象,然后编译。在这个过程,JiBX 比其他项目在操作上要简单,不用定义 DTD 和 Schema,缺点是需要自己定义 Java 程序。
binding runtime
是使用 binding compiler 编译好的 Java class 处理 XML 数据。
下载地址
https://sourceforge.net/projects/jibx/files/
里面包含很多实用的工具:
- bindgen - use JiBX binding and schema generation from code
- codegen - use JiBX binding and code generation from schema
- jibx2wsdl - use JiBX binding, WSDL, and schema generation from code
- starter - use JiBX with supplied (or hand-written) binding definition
使用org.jibx.binding.generator.BindGen
bindGen可以根据类生成对应的binding.xml
- linux:
java -cp ../../lib/jibx-tools.jar:bin org.jibx.binding.generator.BindGen
org.jibx.starter1.Order
- window
java -cp ..\..\lib\jibx-tools.jar;bin org.jibx.binding.generator.BindGen
org.jibx.starter.Order
例如:
E:\zhanghongfeng\eclipse\workspace\netty>java -cp target/classes;lib/jibx-tools.
jar;lib/jibx-bind.jar;lib/jibx-schema.jar;lib/log4j.jar org.jibx.binding.generat
or.BindGen -b /src/main/resources/employee-binding.xml com.journaldev.jibx.bean.
Employee
E:\zhanghongfeng\eclipse\workspace\netty>
- -cp 设置classpath路径,可以加入需要依赖的包。
- -b 设置生成的binding.xml文件存放路径及文件名
- 最后一个参数为需要转换的类
java文件
package com.journaldev.jibx.bean;
public class Employee {
private String id;
private String name;
private String hireDate;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getHireDate() {
return hireDate;
}
public void setHireDate(String hireDate) {
this.hireDate = hireDate;
}
}
生成的binding.xml如下
<binding xmlns:ns1="http://journaldev.com/jibx/bean"
name="_src_main_resources_employee_binding"
package="com.journaldev.jibx.bean">
<namespace uri="http://journaldev.com/jibx/bean" default="elements"/>
<mapping abstract="true" type-name="ns1:employee"
class="com.journaldev.jibx.bean.Employee">
<value style="element" name="id" field="id" usage="optional"/>
<value style="element" name="name" field="name" usage="optional"/>
<value style="element" name="hireDate" field="hireDate" usage="optional"/>
</mapping>
<mapping class="com.journaldev.jibx.bean.Employee" name="employee">
<structure map-as="ns1:employee"/>
</mapping>
</binding>
jibx compile
使用如下命令执行compile
java -cp .:lib/support.jar:/home/dennis/jibx/lib/jibx-bind.jar
org.jibx.binding.Compile binding.xml
例如:
E:\zhanghongfeng\eclipse\workspace\netty>java -cp target/classes;lib/jibx-tools.
jar;lib/jibx-bind.jar;lib/jibx-schema.jar;lib/log4j.jar org.jibx.binding.Compile
employee-bind.xml
E:\zhanghongfeng\eclipse\workspace\netty>
这样就会在对应的class路径下生成:JiBX_employee_bindEmployee_access.class和JiBX_employee_bindFactory.class
jibx run
从xml中转换出类
/**
* 把xml的内容转换为实体类
* @param inputXml xml内容
* @param clazz 实体类名
* @return 实体类
*/
@SuppressWarnings("unchecked")
public <T> T unMarshalEmployee(String inputXml,Class<T> clazz){
try {
IBindingFactory bfact = BindingDirectory.getFactory(clazz);
IUnmarshallingContext uctx = bfact.createUnmarshallingContext();
StringReader stringReader = new StringReader(inputXml);
return (T) uctx.unmarshalDocument(stringReader, null);
} catch (JiBXException e) {
logger.error("转换类:{}异常",clazz.getName(),e);
}
return null;
}
把类转换成xml
/**
* 把类转换成xml
* @param employee 实体对象
* @return xml内容
*/
public <T> String marshalEmployee(T t){
try {
IBindingFactory bfact = BindingDirectory.getFactory(Employee.class);
IMarshallingContext mctx = bfact.createMarshallingContext();
mctx.setIndent(2);
StringWriter stringWriter = new StringWriter();
mctx.setOutput(stringWriter);
mctx.marshalDocument(t, "UTF-8", null);
return stringWriter.toString();
} catch (JiBXException e) {
logger.error("把类:{}转换成xml异常。",t.getClass().getName(),e);
}
return null;
}
Jibx 的maven插件
<build>
<plugins>
<plugin>
<groupId>org.jibx</groupId>
<artifactId>jibx-maven-plugin</artifactId>
<version>1.3.1</version>
<configuration>
<schemaBindingDirectory>src/main/resources</schemaBindingDirectory>
<includeSchemaBindings>
<includeSchemaBindings>*-binding.xml</includeSchemaBindings>
</includeSchemaBindings>
<excludeSchemaBindings>
<excludeSchemaBinding>template-binding.xml</excludeSchemaBinding>
</excludeSchemaBindings>
<verbose>true</verbose>
</configuration>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>bind</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.jibx</groupId>
<artifactId>jibx-run</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.jibx</groupId>
<artifactId>jibx-extras</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.jibx</groupId>
<artifactId>jibx-bind</artifactId>
<version>1.3.1</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>