美文网首页
Jibx序列化xml

Jibx序列化xml

作者: brightranger | 来源:发表于2018-11-24 16:26 被阅读15次

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>

相关文章

网友评论

      本文标题:Jibx序列化xml

      本文链接:https://www.haomeiwen.com/subject/jlkyqqtx.html