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
- 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文件
- 在终端进行入XML文件所在的根目录;
- 运行: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;
}