Jibx序列化xml

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>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容