Jibx使用文档

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值