Jibx使用文档

来源:互联网 发布:java标识符有哪些 编辑:程序博客网 时间:2024/05/16 14:37

1.软件安装


1.1 系统环境

·        Linux: Fedora 17  x86.64

1.2 软件下载

     http://sourceforge.net/projects/jibx/files/

1.3 注意事项

        Jibx工具主要是对XML格式的数据进行解析,进行解析时需要一个模板类,调用编译命令Jibx工具箱能根据模板类生成一个XML文件,再调用编译命令对XML文件进行编译,生成相应的.class,这些class才是最终需要的东西。因此模板类的定义需要与最终的文件格式相对应。

     下载的Jibx包中包含了多个文件夹,example和tutorial文件夹中包含了实例和教程,lib文件夹中包含了所程序运行所需要的包。

 


2 软件使用


2.1 新建工程

      在一个Eclipse下新建一个Java工程,在其中新建一个包,命名为com.iap.dal,接着往工程中导入相关的Jibx的jar文件。

2.2 新建立模板类

       在包com.iap.dal中新建2个类,分别为:Customer和Person

  1. Customer.java

    public class Customer     {          public Person person;          public String street;          public String city;          public String state;          public Integer zip;          public String phone;          /*以下省略了set和get方法*/              ......       }


    2.      Person.java

     public class Person        {               publicint customerNumber;               public String firstName;               public String lastName;               /*以下省略了set和get方法*/               ......         } 


   2.3 由模板映射成XML文档

     1.     在终端中进入到Jibx工程所在的目录,本机下运行:cd /home/xulexun/workspace/Jibx;

     2.     运行:java -cp bin:/home/xulexun/下载/jibx/lib/jibx-tools.jar:/home/xulexun/下载/jibx/lib/log4j.jarorg.jibx.binding.generator.BindGen -b Customer.xml com.iap.dal.Customer ,其中/home/xulexun/下载/jibx/是jibx文件夹的所在位置, Customer.xml是将要生成的XML文件的名称,com.iap.dal.Customer 表示com.iap.dal包下的Customer.java文件,是XML文件数据的来源。

2.4 修改XML文件

生成的XML文件如下所示:

<binding xmlns:ns1="http://iap.com/dal" name="Customer"package="com.iap.dal"><namespace uri="http://iap.com/dal"default="elements"/><mapping abstract="true"type-name="ns1:customer" class="com.iap.dal.Customer">    <structure field="person" usage="optional"name="person">        <value style="attribute" name="customerNumber"field="customerNumber"/>        <value style="element" name="firstName"field="firstName" usage="optional"/>        <value style="element" name="lastName"field="lastName" usage="optional"/>    </structure>        <value style="element" name="street"field="street" usage="optional"/>        <value style="element" name="city" field="city"usage="optional"/>        <value style="element" name="state"field="state" usage="optional"/>        <value style="attribute" name="zip"field="zip" usage="optional"/>        <value style="element" name="phone"field="phone" usage="optional"/></mapping><mapping class="com.iap.dal.Customer"name="customer">    <structure map-as="ns1:customer"/></mapping></binding>

自动生成的XML文件存在缺陷,有时候或总是会显示字段不匹配的错误。

处理方法:

去掉<namespace uri="http://iap.com/dal"default="elements"/>

将<mapping abstract="true" type-name="ns1:customer" class="com.iap.dal.Customer"></binding>里的内容移动到 <mapping class="com.iap.dal.Customer"name="customer"></mapping>之间并将style设置成”element”,这样才能映射多种数据类型,如果style=”attribute”,那么XML文件将无法映射customerNumber和zip这种数据类型为int的成员变量。

 

修改后的XML文件如下所示:

<binding xmlns:ns1="http://iap.com/dal"name="Customer" package="com.iap.dal"><mapping class="com.iap.dal.Customer"name="customer">   <structure field="person" usage="optional"name="person">       <value style="element" name="customerNumber"field="customerNumber"/>       <value style="element" name="firstName"field="firstName" usage="optional"/>       <value style="element" name="lastName"field="lastName" usage="optional"/>   </structure>       <value style="element" name="street"field="street" usage="optional"/>       <value style="element" name="city"field="city" usage="optional"/>       <value style="element" name="state"field="state" usage="optional"/>       <value style="element" name="zip"field="zip" usage="optional"/>       <value style="element" name="phone"field="phone" usage="optional"/></mapping></binding>

    2.5 编译XML文件

  1. 在终端进行入XML文件所在的根目录;   
  2. 运行:java -cp bin:/home/xulexun/下载/jibx/lib/jibx-bind.jar org.jibx.binding.Compile -v Customer.xml ,注意要选择/jibx/lib/在计算机中的位置。

        编译成功后会在~/bin/com/iap/dal/文件下多了2个class文件:JiBX_CustomerCustomer_access.calss 、JiBX_CustomerFactory.class,如果编译失败则需要根据相应的提示进行改进。

      编译成功后生成的XML文件对程序的运行将变得无关紧要,不过调用Jibx要进行多次编译,所以建议保留所生成的XML文件。


3 在程序中调用JIBX

package com.iap.dal;import java.io.ByteArrayInputStream;import java.io.InputStream;import org.jibx.runtime.BindingDirectory;import org.jibx.runtime.IBindingFactory;import org.jibx.runtime.IUnmarshallingContext;import org.jibx.runtime.JiBXException; public class CustomerService{       publicvoid covertXML(String xmlString)       {              try              {                   InputStream reader =String2InputStream(xmlString);                      IBindingFactory factory = BindingDirectory.getFactory(Customer.class);                      IUnmarshallingContext uctx =factory.createUnmarshallingContext();                      Customer customerMessage =(Customer)uctx.unmarshalDocument(reader, null);                      Person personMessage =customerMessage.getPerson();                      System.out.println(personMessage.getFirstName());                      System.out.println(personMessage.getLastName());                      System.out.println(customerMessage.getPhone());                      System.out.println(customerMessage.getStreet());                      System.out.println(customerMessage.getCity());                      System.out.println(customerMessage.getState());               }catch (JiBXException e)              {                      e.printStackTrace();              }       }       /**        *将String类型转化为InputStream类型       */       public InputStream String2InputStream(String str)       {               ByteArrayInputStream stream = newByteArrayInputStream(str.getBytes());               return stream;       }       publicstatic void main(String[] args)       {              StringxmlString = "<customer>" +                                    "<person>" +                                        "<customerNumber>100</customerNumber>" +                                        "<firstName>Jon</firstName>"+                                        "<lastName>lake</lastName>" +                                    "</person>" +                                    "<street>colleagestreet</street>" +                                    "<city>nanning</city>" +                                    "<state>China</state>"+                                    "<zip>1010</zip>" +                                    "<phone>0577-110</phone>" +                                "</customer>";                    //标签名称要与XML文件中的name字段相匹配              CustomerServiceservice = new CustomerService();              service.covertXML(xmlString);          }}


JIBX对中文字符的支持:如果开发环境不是默认为UTF-8的,中文字符的映射会出现错误。在网上查找了很多资料,但是没有完整的例子,在偶然的情况下解决了此问题,不知道是不是完全解决,至少是在我现有的开发环境下是成功运行了。如果默认字符编码是GBK或GB2312的话,修改String2InputStream(String str) 方法:

       public InputStream String2InputStream(String str)       {           ByteArrayInputStream stream = newByteArrayInputStream(str.getBytes(“UTF-8”));     //设置编码为UTF-8           return stream;       }




0 0