一、JiBX概述
JiBX是一款XML(Extensible Markup Language)数据绑定框架。它提供灵活的绑定映射文件,实现数据对象与XML文件之间的转换,并不需要修改既有的Java类。
使用JiBX绑定XML文档与Java对象需分两步走:① 绑定XML文件,也就是映射XML文件与Java对象之间的对应关系;② 在运行时,实现XML文件与Java实例之间的相互转换,此时已经与绑定文件无关了,完全脱耦了。
在运行程序前,需要先配置绑定文件并进行绑定操作,在绑定过程中它将动态修改程序中对应的class文件,主要是生成对应对象实例的方法和添加被绑定标记的属性JiBX_bindingList等。
二、通过JiBX工具生成XML和对象的绑定关系
① 从官方网站下周JiBX,并解压
JiBX - XML Data Binding for Java download | SourceForge.net

② 定义对应的POJO对象
// Order.java
package xml.pojo;
import lombok.Data;
@Data
public class Order {
private String orderNo;
private Customer customer;
private Address billTo;
private Shipping shipping;
private Address shipTo;
private float total;
}
// Customer.java
package xml.pojo;
import lombok.Data;
import java.util.List;
@Data
public class Customer {
private String customerNo;
private String name;
private String firstName;
private String lastName;
private List<String> middleNames;
}
// Address.java
package xml.pojo;
import lombok.Data;
@Data
public class Address {
private String street;
private String city;
private String country;
private String postCode;
private String state;
private String street1;
private String street2;
}
// Shipping.java
package xml.pojo;
public enum Shipping {
STANDARD_MAIL, PRIORITY_MAIL, INTERNATIONAL_MAIL
}
③ 编辑POJO源码文件为class文件

④ 进入POJO class文件路径,使用JiBX工具生成bing.xml绑定文件已经XML数据格式定义文件,并将文件拷贝到Maven工程src\main\resources目录下
JiBX工具使用说明:


<!-- binding.xml -->
<binding xmlns:ns1="http://xml.pojo" name="binding" package="xml.pojo">
<namespace uri="http://xml.pojo" default="elements"/>
<mapping abstract="true" type-name="ns1:order" class="xml.pojo.Order">
<value style="element" name="orderNo" field="orderNo" usage="optional"/>
<structure field="customer" usage="optional" name="customer">
<value style="element" name="customerNo" field="customerNo" usage="optional"/>
<value style="element" name="name" field="name" usage="optional"/>
<value style="element" name="firstName" field="firstName" usage="optional"/>
<value style="element" name="lastName" field="lastName" usage="optional"/>
<collection field="middleNames" usage="optional" create-type="java.util.ArrayList">
<value name="middleName" type="java.lang.String"/>
</collection>
</structure>
<structure map-as="ns1:address" field="billTo" usage="optional" name="billTo"/>
<value style="element" name="shipping" field="shipping" usage="optional"/>
<structure map-as="ns1:address" field="shipTo" usage="optional" name="shipTo"/>
<value style="attribute" name="total" field="total"/>
</mapping>
<mapping class="xml.pojo.Order" name="order">
<structure map-as="ns1:order"/>
</mapping>
<mapping abstract="true" type-name="ns1:address" class="xml.pojo.Address">
<value style="element" name="street" field="street" usage="optional"/>
<value style="element" name="city" field="city" usage="optional"/>
<value style="element" name="country" field="country" usage="optional"/>
<value style="element" name="postCode" field="postCode" usage="optional"/>
<value style="element" name="state" field="state" usage="optional"/>
<value style="element" name="street1" field="street1" usage="optional"/>
<value style="element" name="street2" field="street2" usage="optional"/>
</mapping>
</binding>
<!-- xml.pojo.xsd -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://xml.pojo" elementFormDefault="qualified" targetNamespace="http://xml.pojo">
<xs:complexType name="order">
<xs:sequence>
<xs:element type="xs:string" name="orderNo" minOccurs="0"/>
<xs:element name="customer" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="customerNo" minOccurs="0"/>
<xs:element type="xs:string" name="name" minOccurs="0"/>
<xs:element type="xs:string" name="firstName" minOccurs="0"/>
<xs:element type="xs:string" name="lastName" minOccurs="0"/>
<xs:element type="xs:string" name="middleName" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element type="tns:address" name="billTo" minOccurs="0"/>
<xs:element name="shipping" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="STANDARD_MAIL"/>
<xs:enumeration value="PRIORITY_MAIL"/>
<xs:enumeration value="INTERNATIONAL_MAIL"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element type="tns:address" name="shipTo" minOccurs="0"/>
</xs:sequence>
<xs:attribute type="xs:float" use="required" name="total"/>
</xs:complexType>
<xs:complexType name="address">
<xs:sequence>
<xs:element type="xs:string" name="street" minOccurs="0"/>
<xs:element type="xs:string" name="city" minOccurs="0"/>
<xs:element type="xs:string" name="country" minOccurs="0"/>
<xs:element type="xs:string" name="postCode" minOccurs="0"/>
<xs:element type="xs:string" name="state" minOccurs="0"/>
<xs:element type="xs:string" name="street1" minOccurs="0"/>
<xs:element type="xs:string" name="street2" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:element type="tns:order" name="order"/>
</xs:schema>
三、使用Maven插件,在编译时绑定XML文件与Java对象之间的对应关系
</dependencies>
<dependency>
<groupId>org.jibx</groupId>
<artifactId>jibx-run</artifactId>
<version>1.2.6</version>
</dependency>
<dependency>
<groupId>org.jibx</groupId>
<artifactId>jibx-extras</artifactId>
<version>1.2.6</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<!-- 生成jibx class信息 -->
<groupId>org.jibx</groupId>
<artifactId>jibx-maven-plugin</artifactId>
<version>1.3.3</version>
<configuration>
<schemaBindingDirectory>
${basedir}/target/classes
</schemaBindingDirectory>
<includeSchemaBindings>
<includeSchemaBindings>*binding.xml</includeSchemaBindings>
</includeSchemaBindings>
<verbose>true</verbose>
</configuration>
<executions>
<execution>
<id>jibx-bind</id>
<phase>compile</phase>
<goals>
<goal>bind</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
四、编写测试代码,验证结果:
import org.jibx.runtime.*;
import xml.pojo.Order;
import xml.pojo.OrderFactory;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
public class Test {
private IBindingFactory factory = null;
private StringWriter writer = null;
private StringReader reader = null;
private final static String CHARSET_NAME = "UTF-8";
private String encode2Xml(Order order) throws JiBXException, IOException {
factory = BindingDirectory.getFactory(Order.class);
writer = new StringWriter();
IMarshallingContext mctx = factory.createMarshallingContext();
mctx.setIndent(2);
mctx.marshalDocument(order, CHARSET_NAME, null, writer);
String xmlStr = writer.toString();
writer.close();
System.out.println(xmlStr.toString());
return xmlStr;
}
private Order decode2Order(String xmlBody) throws JiBXException {
reader = new StringReader(xmlBody);
IUnmarshallingContext unmarshallingContext = factory.createUnmarshallingContext();
Order order = (Order) unmarshallingContext.unmarshalDocument(reader);
return order;
}
public static void main(String[] args) throws JiBXException, IOException {
Test test = new Test();
Order order = OrderFactory.create("123456789");
String body = test.encode2Xml(order);
Order order2 = test.decode2Order(body);
System.out.println(order2);
}
}
2038

被折叠的 条评论
为什么被折叠?



