JiBX 簡(jiǎn)介
JiBX 是一個(gè)綁定 XML 數(shù)據(jù)到 Java 對(duì)象的框架。JiBX 用一個(gè)綁定定義文擋(binding definition document)來(lái)定義 XML 數(shù)據(jù)與 Java 對(duì)象轉(zhuǎn)換的規(guī)則(binding.xml),這個(gè)文擋就是聯(lián)系 XML 數(shù)據(jù)與 Java 對(duì)象之間的橋梁。
官網(wǎng)文檔地址: http://jibx.sourceforge.net/index.html
使用 JiBX 的過(guò)程分成兩個(gè)過(guò)程,一個(gè)是 binding compiler,另一個(gè)是 binding runtime。
binding compiler
是一個(gè)前期準(zhǔn)備過(guò)程,包括定義綁定定義文擋,定義與 XML 綁定在一起的 Java 對(duì)象,然后編譯。在這個(gè)過(guò)程,JiBX 比其他項(xiàng)目在操作上要簡(jiǎn)單,不用定義 DTD 和 Schema,缺點(diǎn)是需要自己定義 Java 程序。
binding runtime
是使用 binding compiler 編譯好的 Java class 處理 XML 數(shù)據(jù)。
下載地址
https://sourceforge.net/projects/jibx/files/
里面包含很多實(shí)用的工具:
- 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可以根據(jù)類(lèi)生成對(duì)應(yīng)的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 設(shè)置classpath路徑,可以加入需要依賴(lài)的包。
- -b 設(shè)置生成的binding.xml文件存放路徑及文件名
- 最后一個(gè)參數(shù)為需要轉(zhuǎn)換的類(lèi)
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
使用如下命令執(zhí)行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>
這樣就會(huì)在對(duì)應(yīng)的class路徑下生成:JiBX_employee_bindEmployee_access.class和JiBX_employee_bindFactory.class
jibx run
從xml中轉(zhuǎn)換出類(lèi)
/**
* 把xml的內(nèi)容轉(zhuǎn)換為實(shí)體類(lèi)
* @param inputXml xml內(nèi)容
* @param clazz 實(shí)體類(lèi)名
* @return 實(shí)體類(lèi)
*/
@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("轉(zhuǎn)換類(lèi):{}異常",clazz.getName(),e);
}
return null;
}
把類(lèi)轉(zhuǎn)換成xml
/**
* 把類(lèi)轉(zhuǎn)換成xml
* @param employee 實(shí)體對(duì)象
* @return xml內(nèi)容
*/
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("把類(lèi):{}轉(zhuǎn)換成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>