小阳说:本文介绍了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
参考文献: