小阳说:本文介绍了JAXB的基本定义,常用的类、接口以及标记。并通过一个简单的示例,演示POJO与XML之间的转换操作。
1、JAXB简介
JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到 XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地 结合XML数据和处理函数。
JAXB 2.0是JDK 1.6的组成部分。JAXB 2.2.3是JDK 1.7的组成部分。
2、API介绍
2.1 类和接口
- JAXBContext类,是应用的入口,用于管理XML/Java绑定信息。
- Marshaller接口,将Java对象序列化为XML数据。
- Unmarshaller接口,将XML数据反序列化为Java对象。
2.2 标记
- @XmlType,将Java类或枚举类型映射到XML模式类型
- @XmlAccessorType(XmlAccessType.FIELD) ,控制字段或属性的序列化。FIELD表示JAXB将自动绑定Java类中的每个非静态的(static)、非瞬态的(由@XmlTransient标 注)字段到XML。其他值还有XmlAccessType.PROPERTY和XmlAccessType.NONE。
- @XmlAccessorOrder,控制JAXB 绑定类中属性和字段的排序。
- @XmlJavaTypeAdapter,使用定制的适配器(即扩展抽象类XmlAdapter并覆盖marshal()和unmarshal()方法),以序列化Java类为XML。
- @XmlElementWrapper ,对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素(称为包装器)。
- @XmlRootElement,将Java类或枚举类型映射到XML元素。
- @XmlElement,将Java类的一个属性映射到与属性同名的一个XML元素。
- @XmlAttribute,将Java类的一个属性映射到与属性同名的一个XML属性。
3、简单示例代码
新建一个普通java工程(当前笔者的jdk版本为jdk6)。然后新建一个学生类(Student)和主函数类(JAXBExample)。
不依赖任何外部类库哦
Student.java的代码如下:
package org.samuel.study.jaxb;
import java.util.Date;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Student {
private int id;
private String name;
private int age;
private Date birthday;
public int getId() {
return id;
}
@XmlAttribute
public void setId(int id) {
this.id = id;
}
@XmlElement
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
@XmlElement
public void setAge(int age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
@XmlElement
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
测试代码如下:
package org.samuel.study.jaxb;
import java.io.File;
import java.text.SimpleDateFormat;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
public class JAXBExample {
public static SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
public static void main(String[] args) throws Exception {
marshal();
unmarshal();
}
public static void marshal() throws Exception {
Student student = new Student();
student.setId(1);
student.setName("yangfeng");
student.setAge(25);
student.setBirthday(df.parse("19870322"));
JAXBContext jaxbContext = JAXBContext.newInstance(Student.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
// 打印到控制台
jaxbMarshaller.marshal(student, System.out);
// 持久化到文件
jaxbMarshaller.marshal(student, new File("student.xml"));
}
public static void unmarshal() throws Exception {
JAXBContext jaxbContext = JAXBContext.newInstance(Student.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
// 从文件读取
Student student = (Student) jaxbUnmarshaller.unmarshal(new File("student.xml"));
System.out.println(student.getId());
System.out.println(student.getName());
System.out.println(student.getAge());
System.out.println(df.format(student.getBirthday()));
}
}
4、项目结构和控制台输出
有图有真相哦。
图1 项目结构
图2 控制台输出
5、后话
本篇只是一个最简单的例子。JAXB为Java程序员在POJO与xml的转换上提供了极大的便利。
JAXB有很多应用场景。例如客户端和服务器端的XML数据通信就可以使用JAXB。服务器端不再繁琐的使用DOM4J来组装XML文件,客户端也不需要繁杂的解析步骤。
示例工程下载:jaxb.jar
参考文献: