JIBX简介

jibx基础简介一
一 JiBX 简介
JiBX 是一个绑定 XML 数据到 Java 对象的框架。JiBX 用一个绑定定义文挡(binding definition document)来定义 XML 数据与 Java 对象转换的规则,这个文挡就是联系 XML 数据与 Java 对象之间的桥梁。
这里有必要先介绍两个数据绑定术语 marshal 和 unmarshal,marshal 是由 Java 对象生成 XML 文挡,unmarshal 是根据 XML 文挡建立 Java 对象。
使用 JiBX 的过程分成两个过程,一个是 binding compiler,另一个是 binding runtime。binding compiler 是一个前期准备过程,包括定义绑定定义文挡,定义与 XML 绑定在一起的 Java 对象,然后编译。在这个过程,JiBX 比其他项目在操作上要简单,不用定义 DTD 和 Schema,缺点是需要自己定义 Java 程序。binding runtime 是使用 binding compiler 编译好的 Java class 处理 XML 数据。
JiBX 也用到了第三方的工具 XPP3 Pull Parser 和 BCEL,在 JiBX 发布的文件中也包含了这两个工具相关的文件。
二 简单范例
按照惯例,还是从最简单的例子说起。
首先从 JiBX 网站下载 JiBX,当前最新版本是 beta 3。解开下载的 zip 文件,里面有一个 lib 目录,包含了 bcel.jar, jibx-bind.jar, jibx-extras.jar, jibx-run.jar, xpp3.jar 五个 jar 文件。bcel.jar, jibx-bind.jar 只有在 binding compiler 的时候才用得到。jibx-extras.jar 是一个可选的工具包,里面有一些测试和验证的工具类。
1.定义一个我们将要处理 XML 文件,文件名为 data.xml,内容如下:

<customer>
<person>
<cust-num>123456789</cust-num>
<first-name>John</first-name>
<last-name>Smith</last-name>
</person>
<street>12345 Happy Lane</street>
<city>Plunk</city>
<state>WA</state>
<zip>98059</zip>
<phone>888.555.1234</phone>
</customer>
这个 XML 文件非常简单,共有十个元素,没有属性。根元素 customer 有 person, street, city, state, zip, phone 六个子元素。其中元素 person 有 cust-num, first-name, last-name 三个子元素。
2.接着定义两个 Java 类 Customer 和 Person,也采用最简单的方式,用对象的域值对应元素,内容如下:

public class Customer {
public Person person;
public String street;
public String city;
public String state;
public Integer zip;
public String phone;
}

public class Person {
public int customerNumber;
public String firstName;
public String lastName;
}
这个两个类没有任何方法,够简单吧!或许你已经看出来了,Customer 类的七个 field 对应的是 XML 文件中 customer 元素的七个子元素。Person 类的三个 field 对应的是 person 元素的三个子元素。在 Person 类的 field 的名称并不是和 person 元素的子元素名称完全相等,这是遵守 Java 编程规范 field 命名的需要,虽然不相等,但这不重要,可以在绑定定义文挡中把它们一一对应起来。
3.绑定定义文挡
绑定定义文挡是依据绑定定义规范将 XML 数据和 Java 对象绑定的 XML 文挡。文件名为 binding.xml,内容如下:

<binding>
<mapping name="customer" class="Customer">
<structure name="person" field="person">
   <value name="cust-num" field="customerNumber"/>
   <value name="first-name" field="firstName"/>
   <value style="text" field="lastName"/>
</structure>
<value name="street" field="street"/>
<value name="city" field="city"/>
<value name="state" field="state"/>
<value name="zip" field="zip"/>
<value name="phone" field="phone"/>
</mapping>
</binding>
binding.xml 文件中的 name 和 field 属性分别将 XML 中的元素和 Java 对象中的 field 一一对应并绑定起来。

<mapping name="customer" class="Customer">
mapping 元素的 name 和 class 属性将 customer 根元素和 Customer 类绑定在一起。

<structure name="person" field="person">

public Person person;
上面两行定义了 person 是 Customer 的 field,同时也把 person 元素和 person 类绑定在一起。


4.执行 Binding Compiler 过程
以下命令是在 Linux 下执行,如果是 Windows 平台请转换成相应的命令

#javac Person.java
#javac -classpath . Customer.java
#java -jar lib/jibx-bind.jar binding.xml
执行完后,在当前目录多了四个 class 文件,分别是 Person.class, Customer.class, JiBX_bindingCustomer_access.class, JiBX_bindingFactory.class。
5.执行 binding runtime 过程
首先定制一个 XML 数据文件 data.xml, 内容如下:

<customer>
<person>
<cust-num>123456789</cust-num>
<first-name>John</first-name>
<last-name>Smith</last-name>
</person>
<street>12345 Happy Lane</street>
<city>Plunk</city>
<state>WA</state>
<zip>98059</zip>
<phone>888.555.1234</phone>
</customer>
接着写一个简单的读取 data.xml 测试程序 Test.java,内容如下:

import java.io.FileInputStream;
import java.io.FileNotFoundException;

import org.jibx.runtime.JiBXException;
import org.jibx.runtime.IBindingFactory;
import org.jibx.runtime.BindingDirectory;
import org.jibx.runtime.IUnmarshallingContext;

class Test {
public static void main(String[] args) {
try{
    IBindingFactory bfact = BindingDirectory.getFactory(Customer.class);
    IUnmarshallingContext uctx = bfact.createUnmarshallingContext();
    Customer customer = (Customer)uctx.unmarshalDocument(new FileInputStream("data.xml"), null);
    Person person = customer.person;

    System.out.println("cust-num:" + person.customerNumber);
    System.out.println("first-name:" + person.firstName);
    System.out.println("last-name:" + person.lastName);
    System.out.println("street:" + customer.street);
}catch(FileNotFoundException e){
    System.out.println(e.toString());
}catch(JiBXException e){
    System.out.println(e.toString());
}
}
}
编译并运行这个测试程序

#javac -classpath .:lib/jibx-run.jar Test.java
#java -cp .:lib/jibx-run.jar:lib/xpp3.jar Test
程序运行的结果是

cust-num:123456789
first-name:John
last-name:Smith
street:12345 Happy Lane

基本类型与默认值
在JiBX绑定java对象时,如果你使用了基本类型,又使用了字段为可选值时,你得检查实际值与你的期望值是否相等。这样说起有点模糊,举个例子说明吧。如果java类里有一个名为intValue 的int类型的字段和一个名为stringValue的String类型的字段,同时又在绑定文件中为这两个字段配置为usage="optional",如:
<value name="intValue" field="intValue" usage="optional"/>
<value name="stringValue" field="stringValue" usage="optional" />
也就是说这两个字段为可选值,可有可无。我们在编排xml文件时,我们可以通过判断stringValue是否等于null来确认是否要在xml文件里显示该element;而该字段是基本类型,比如说之前说的intValue,就不能通过null来判断了,JiBX的做法是判断基本类型是否等于默认值,也就是说判断intValue是否等于0;如果是0,就不显示该element,为非0值时,才能显示该element。
这样讲解后,你应该得出一个结论,如果让基本类型为可选项时,是无法输出默认值的。在解决这个问题上,我们不使用基本类型就行了,JDK5.0也支持自动装箱和拆箱了,再某些属性声明时不是用基本类型对我们的影响并不是很大;或者寄希望于JiBX以后的版本实现装箱和拆箱操作。
-
使用char时要小心
上面提到了在要绑定的字段里不推荐使用基本类型,如果你一定要使用基本类型,就得小心使用char类型,因为char类型比较特殊,你可以把它看作是只有一个字符的String,也可以看成是0-65535之间的一个数字,所以在JiBX使用时,你需要明确该类型字段在转换时的序列化和反序列化操作。幸运的是,JiBX提供了这样的序列化和反序列化类,在绑定文件里应加上如下可选属性:
<value name="stringValue" field="stringValue"
serializer="org.jibx.runtime.Utility.serializeCharString" deserializer="org.jibx.runtime.Utility.deserializeCharString"/>
-
使用接口时需给出工厂方法
从xml文件转换到java对象时,是先要创建该类的实例的,如果转换的是一个实体类,创建实例就不会有什么问题,但是如果我们要使用接口编程,转换的对象就是一个接口,则会出现错误,因为JiBX并不清楚你需要创建这个接口的那个实例,这将会导致错误;所以我们需要在绑定文件中指明该接口的创建工厂方法。例如:我们声明一个List的属性listValue,想要它指向一个ArrayList的实例,我们则需要写一个返回ArrayList实例的工厂方法getArrayListInstance;并在绑定文件中添加factory可选属性,如下:
<collection field="listValue"
factory="com.gelc.JiBXInterfaceFactory.getArrayListInstance" />
    另外值得一提的就是,JiBX例子里的工厂方法的modifier是private,我用JUint对代码进行测试不会有问题,但是用ant运行同样的测试,就会有IllegalAccessError,这是JiBX存在的一个Bug;对于该问题,我建议将modifier改为public,这样就不会出现问题。
-
如何使用Map
    在JiBX的核心包里是不支持Map类型的转换的,不过你不用担心,在JiBX的jibx-extras.jar附加包里提供了对Map的支持。你想使用Map还需要为它重写marshal/ummarshal方法,你不要被这个给吓倒了,因为JiBX已经为你提供了这个实现框架,你只需要作相应的修改就ok了。如果你想了解更多,可以参考JiBX提供的定制JiBX绑定方法指南。
-
中文问题又来了
    说到java项目中的中文问题,我相信很多开发者都遇到过,JiBX对中文的支持也不太让人满意,因为JiBX只支持Java标准的字符集,也就是说我们常用的GB2312和GBK不在支持行列之内,如果你用的是UTF-8来处理中文,则没有任何问题,但是你想用GB2312或GBK编码来实现转换的话,则需要你自己实现GB2312和GBK的Escaper类,重写writeAttribute(String, Writer)、writeCData(String, Writer)和writeContent(String, Writer)方法,由于GB2312和GBK的编码规则是相同的,只是字符集大小不一样,所以你可以让同一个Escaper来处理这两种编码。

总结:
在整个jibx开发过程中最重要的有一下两点:
一、binding.xml编写
java类和XML文件的关系文件(bingding.xml)的编写,关于这一点jibx的指南里面举出了22个关系映射例子,有需要的朋友可以好好研究一下这22中关系映射。
二、执行binding编译
好多初学者(包括我)都会忽略这一点,其实这一步是整个jibx绑定过程中必不可少的一步,非常关键,虽然这只要开发者敲几行命令或者写一个ant文件,其余jibx都会自动完成。上面二中提到的是用命令完成绑定的过程,下面附一份ant build.xml文件:

这文件内容需要稍加修改(主要是路径和类名)才能用到上面的例子中。

<?xml version="1.0"?>
<!-- This build file can be used within an IDE environment to bind the JiBX
binding definition model classes - after building or modifying the model
classes, run the default "bind" target of this script to compile the internal
bindings. -->
<project basedir="." default="bind">
  
<!-- JiBX binding compiler task definition -->
<property envir/>
<property name="jibxhome" value="${basedir}"/>
<taskdef name="bind" classname="org.jibx.binding.ant.CompileTask">
    <classpath>
      <pathelement location="${jibxhome}/lib/bcel.jar"/>
      <pathelement location="${jibxhome}/lib/jibx-bind.jar"/>
      <pathelement location="${jibxhome}/lib/jibx-run.jar"/>
      <pathelement location="${jibxhome}/lib/jibx-extras.jar"/>
      <pathelement location="${jibxhome}/lib/xpp3.jar"/>  
    </classpath>
</taskdef>
  
<!-- bind the class files -->
<target name="bind">
    <echo message="Running binding compiler..."/>
    <bind load="true">
      <bindingfileset dir="${basedir}/src">
        <include name="com/freeboy/jibx/test/binding0.xml"/>
      </bindingfileset>
      <classpathset dir="${jibxhome}/lib/jibx-run.jar"/>
      <classpathset dir="${jibxhome}/lib/jibx-extras.jar"/>
      <classpathset dir="${basedir}/classes"/>
    </bind>
</target>
</project>  

 

jibx官网下载的jar以及开发文档 jibx官网下载的jar以及开发文档,jibx官网很难打开,先保存下来受用 立即下载

相关推荐

JiBx 1.3.1

JiBx是一个优秀的绑定Java对象与XML文件的工具,1.3.1版本可以与jdk1.8完美兼容

JiBX 的实操

你了解JiBX 吗? 知道如何实现XML和POJO对象的快速转换吗? 本文非常详细的教大家如何一步步实现功能,包括代码和截图。再难的技术,只要我们一步步动手去实现它,我们就能完成量变到质变的转变。

echohuangshihuxue的博客 1126

JiBx开发入门指南

JiBx又一个不错的xml绑定工具,和jaxb等一样,都是属于xml绑定工具。而JiBx使用java字节码enhance技术,不像jaxb等更多在于源代码生成技术。JiB的工作主要在于前期,也就是进行字节码绑定,这一部分基本上都是在编译器完成的。在运行期,不需要任何的配置,由于字节码已经嵌入java类中,并不是在于运行期绑定,而是通过元数据或者xsd文件进行解析绑定。效率和性能上无疑是佼佼者。 文档格式:PDF(清晰),语言:中文

基于JiBX框架的XML数据与POJO对象的转换

使用JiBX绑定XML文档与Java对象需分两步走:① 绑定XML文件,也就是映射XML文件与Java对象之间的对应关系;在运行程序前,需要先配置绑定文件并进行绑定操作,在绑定过程中它将动态修改程序中对应的class文件,主要是生成对应对象实例的方法和添加被绑定标记的属性JiBX_bindingList等。④ 进入POJO class文件路径,使用JiBX工具生成bing.xml绑定文件已经XML数据格式定义文件,并将文件拷贝到Maven工程src\main\resources目录下。

譚潇逺的博客 768

JIBX 资源包

这是我从JIBX官网下载下来的最新版的JIBX资源包。JIBX可以方便的实现XML文档到JAVA对象的转换。

2.ROS实用工具:坐标变换

本文围绕ROS坐标变换展开,介绍其在机器人系统中的关键作用,即统一不同传感器和执行器坐标系,服务数据融合等操作。基于ROS的tf库,从广播和监听TF变换两方面阐述实现过程,涵盖新建工作包、编写广播和监听代码、配置构建文件及编译等步骤。此外,介绍启动节点管理器后运行广播和监听节点的方法,并通过rqt_graph、rqt_tf_tree、tf_echo等工具可视化和获取坐标系变换信息。借助这些内容,读者不仅能掌握ROS坐标变换的实现,还能对机器人坐标变换系统的调试和理解有更深入认识 。

qq_74168740的博客 1173

JiBX 的简单使用

在学习 Netty 的过程中,有使用 JiBX 的地方,所以这里简单记录一下使用方法。 JiBX 简介 JiBX 是一个绑定 XML 数据到 Java 对象的框架。JiBX 用一个绑定定义文挡(binding definition document)来定义 XML 数据与 Java 对象转换的规则,这个文挡就是联系 XML 数据与 Java 对象之间的桥梁。 这里有必要先介绍两个数据

挖坑埋你 4669

Burp Suite手工验证CORS漏洞的四步闭环法

CORS(跨域资源共享)是Web应用实现跨域通信的基础机制,其安全本质在于服务端对Origin头的校验逻辑与响应头组合的语义一致性。当服务端错误地返回Access-Control-Allow-Origin: *并配合Access-Control-Allow-Credentials: true,或采用弱校验(如字符串包含匹配)时,将导致敏感数据泄露与凭据劫持风险。该漏洞难以被自动化扫描器发现,因其依赖请求上下文、认证状态及动态策略判断。Burp Suite作为核心工具,需通过构造跨域请求、捕获预检响应、交叉验

weixin_30596343的博客 512

Jibx 使用入门

如何使用Jibx框架? 首先要明白,Ji

ITMAOO 1542

陀螺仪及四元数解算

陀螺仪 四元数

zb313982521的博客 2005

【原创工具 | OpenCV-CamCalib】一个基于 OpenCV 的自动化相机数据采集和标定程序

一个基于OpenCV的自动化相机数据采集和标定程序。系统内置相机地址默认为 0。

XavierJ的博客 2698

Jibx插件的使用,nginx调优与排错

/** Billing address information. */ private Address billTo; private Shipping shipping; /** Shipping address information. If missing, the billing address is also used as the shipping address. */ private Address shipTo; private Float total; public long

m0_64867152的博客 776

0基础手把手搭建 Trae\+Seedance2\.0 真人短剧生成智能体(可直接运行)

前言:本文专为0基础新手编写,全程无复杂代码、无专业术语,一步一截图提示(操作路径清晰),只需跟着点鼠标、复制粘贴,就能搭建出可自动生成真人短剧的智能体,生成的短剧可直接导出发布。核心工具:Trae(字节跳动AI IDE,免费)+ Seedance2.0(真人视频生成API,公测免费),无需提前学习编程、设计,全程10-15分钟搞定。 适用人群:0基础小白、想快速生成真人短剧(自媒体、短视频创作者)、无需懂技术即可实现自动化短剧生成的人群。

skygulangfendouz的专栏 1058

jibx java_jibx简介

(1)jibx简介jibx又一个不错的xml绑定工具,随着这段时间的使用,感觉越来越随心应手了。和jaxb一样,都是属于xml绑定工具。不同于jaxb,jibx使用java字节码enhance技术,而jaxb更多在于源代码生成技术。jibx的工作主要在于前期,也就是进行字节码绑定,这一部分基本上都是在编译器完成的。在运行期,不需要任何的配置,由于字节码已经嵌入java类中。而jaxb更多在于运行期...

weixin_39846378的博客 448

银河麒麟v10-arm版离线安装Portainer

银河麒麟v10-arm版离线安装Portainer

q_hsolucky的博客 3051

17、自适应和学习索引:在线物理设计调整的新维度

本文探讨了现代数据库管理系统中自适应索引和数据库裂解的新方法,通过结合学习模型与多臂老虎机(MAB)框架,实现在线物理设计调整。文章详细介绍了自适应索引的工作原理、数据库裂解技术以及如何利用机器学习进行索引选择和优化,并讨论了MAB框架在动态调整索引结构中的应用及其实际案例。

go5gopher的博客 82

Jibx

jibx基础简介一 一 JiBX 简介 JiBX 是一个绑定 XML 数据到 Java 对象的框架。JiBX 用一个绑定定义文挡(binding definition document)来定义 XML 数据与 Java 对象转换的规则,这个文挡就是联系 XML 数据与 Java

kbeanwu的专栏 7257

【AHE数据集】历史/未来全球网格热排放数据 PF-AHF

AHE数据集

WW、forever的博客 127

java-xml互转

jibx基础简介一 一 JiBX 简介 JiBX 是一个绑定 XML 数据到 Java 对象的框架。JiBX 用一个绑定定义文挡(binding definition document)来定义 XML 数据与 Java 对象转换的规则,这个文挡就是联系 XML 数据与 Java 对象之间的桥梁。 这里有必要先介绍两个数据绑定术语 marshal 和 unmarshal,marshal ...

j2ee的学习 165

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Jibx插件的使用

  Jibx是一款非常优秀的XML文件数据绑定的框架,提供灵活的绑定映射文件,实现数据对象和XML文件之间的转换,并不需要修改既有的Java,另外,它的转换效率是目前很多其他开源项目都无法比拟的。本文来演示下如何使用 Jibx插件的使用 下载Jibx插件: 链接:https://pan.baidu.com/s/1Va9D8LZlxoVU5VndC7T1ag 提取码:oyjt Pojo创建 Ord...

波波烤鸭的博客 2727

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

JIBX的工具使用

JiBX是一款优秀的XML数据绑定框架。它提供灵活的绑定映射文件,实现数据对象与XML文件之间的转换,并不需要修改既有的java类。 它的主要优点:转换效率高、配置绑定文件简单、不需要操作xpath文件,不需要写get/set方法,对象属性名与xml文件element名可以不同等等。 它与JAXB的比较:不同于jaxb,jibx使用java字节码enhance技术,而jaxb更多在于源代码生成

a329661511的博客 2103

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

jibx_JiBX教程

jibxWelcome to JiBX tutorial. JiBX is a very powerful framework for converting XML data to java object and vice versa. It is very useful in applications integration where XML is the format for data tr...

从零开始的教程世界 746

Jibx使用文档

1.软件安装 1.1 系统环境 ·        Linux: Fedora 17  x86.64   1.2 软件下载      http://sourceforge.net/projects/jibx/files/      1.3 注意事项         Jibx工具主要是对XML格式的数据进行解析,进行解析时需要一个模板类,调用编译命令Jibx工具箱能根据模板类生成一个

white_smile的专栏 1320

codec之JiBX

JIBX入个门大概步骤导入相关包pom.xml配置maven插件编写类文件类文件编译生成binding.xml和xsd文件执行bind操作编写测试代码最后 大概 官方首页 传送门 jibx是一个xml与java 对象之间进行转换的框架,听说效率是很高的,spring中也有使用。 在学习netty的http+xml协议过程中,使用到它,无奈知识浅薄,期间不幸遇到了很多麻烦,在此记录一下从java类到xml的使用,以及相关配置,后备无患。关于原理,更详细的用法,或者其他用法,比如从xml到类的使用,得去官网慢慢

INK_FUNC的博客 588

JiBX笔记总结

简介JiBX是一款非常优秀的XML(Extensible Markup Language)数据绑定框架。它提供灵活的绑定映射文件实现数据对象与XML文件之间的转换;并不需要你修改既有的Java类。另外,另外,它的转换效率是目前很多开源项目都无法比拟的。他的转换效率高,配置绑定文件简单,不需要操作xpath文件,不需要写属性的get/set方法,对象属性名与xml文件element名不用相同,只需在bing的时候建立映射。JiBX使用了XPP(XML Pull Parsing)技术,XPP使用的是不断增加数据

小菜的一天 1098

java jibx_JiBX笔记

注意事项JiBX:1.2.2 (https://sourceforge.net/projects/jibx/files/jibx/jibx-1.2.2/)JDK:1.6 (http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase6-419409.html)ANT:1.9.12 (htt...

weixin_29050513的博客 462
上一篇: HttpClient使用方法总结
下一篇: ubuntu10.4下java开发环境的部署(转)
zhlinuxlu
博客等级 码龄19年 0粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值