基于JiBX框架的XML数据与POJO对象的转换

一、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工具使用说明:

JiBX: BindGen Tool

 

<!-- 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);

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值