首页 > 代码库 > XML编程总结(六)——使用JAXB进行java对象和xml格式之间的相互转换

XML编程总结(六)——使用JAXB进行java对象和xml格式之间的相互转换

(六)使用JAXB进行java对象和xml格式之间的相互转换

JAXB能够使用Jackson对JAXB注解的支持实现(jackson-module-jaxb-annotations),既方便生成XML,也方便生成JSON,这样一来可以更好的标志可以转换为JSON对象的JAVA类。

JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。

JDK中JAXB相关的重要Class和Interface

JAXBContext类,是应用的入口,用于管理XML/Java绑定信息。

Marshaller接口,将Java对象序列化为XML数据。

Unmarshaller接口,将XML数据反序列化为Java对象。

JDK中JAXB相关的重要Annotation注解不能使用在字段上,只能使用在getter/setter方法上

@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属性。

测试代码:

Student.java:

 1 public class Student { 2     private String name; 3     private int age; 4     private String sex; 5     private Date birthday; 6     private String address; 7     private List<Friend> friends; 8  9     public Student() {10     }11 12     public Student(String name, int age, String sex, Date birthday, String address) {13         this.name = name;14         this.age = age;15         this.sex = sex;16         this.birthday = birthday;17         this.address = address;18     }19 20     public String getName() {21         return name;22     }23 24     public void setName(String name) {25         this.name = name;26     }27 28     //将age字段变成student的一个属性29     @XmlAttribute30     public int getAge() {31         return age;32     }33 34     public void setAge(int age) {35         this.age = age;36     }37 38     public String getSex() {39         return sex;40     }41 42     public void setSex(String sex) {43         this.sex = sex;44     }45 46     public Date getBirthday() {47         return birthday;48     }49 50     public void setBirthday(Date birthday) {51         this.birthday = birthday;52     }53 54     public String getAddress() {55         return address;56     }57 58     public void setAddress(String address) {59         this.address = address;60     }61 62     //指定用<friends>标签包围,子标签为<friend>63     @XmlElementWrapper(name="friends")64     @XmlElement(name="friend")65     public List<Friend> getFriends() {66         return friends;67     }68 69     public void setFriends(List<Friend> friends) {70         this.friends = friends;71     }72 }

Friend.java:

 1 public class Friend { 2  3     private String name; 4     private int age; 5     private String address; 6  7     public Friend() { 8     } 9 10     public Friend(String name,int age,String address) {11         this.name = name;12         this.age=age;13         this.address=address;14     }15 16     public String getName() {17         return name;18     }19 20     public void setName(String name) {21         this.name = name;22     }23 24     @XmlAttribute25     public int getAge() {26         return age;27     }28 29     public void setAge(int age) {30         this.age = age;31     }32 33     public String getAddress() {34         return address;35     }36 37     public void setAddress(String address) {38         this.address = address;39     }40 }

Students.java:

 1 @XmlRootElement(name="students") 2 public class Students { 3  4     private List<Student> students; 5  6     @XmlElement(name="student") 7     public List<Student> getStudents() { 8         return students; 9     }10 11     public void setStudents(List<Student> students) {12         this.students = students;13     }14 }

JAXBTest.java:

 1 public class JAXBTest { 2  3     /** 4      * 将java对象转换成xml,并用注解指定生成规则,是生成属性还是生成节点 5      * @throws Exception 6      */ 7     @Test 8     public void testMarshaller() throws Exception{ 9         //获得转换的上下文对象10         JAXBContext context = JAXBContext.newInstance(Students.class);11         //获得Marshaller对象12         Marshaller marshaller = context.createMarshaller();13         marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);14         //将java对象进行转换成xml15         Students students=new Students();16         List<Student> list=new ArrayList<Student>();17         //第一个Student18         Student student1=new Student("张三",19,"男",new Date(),"北京市怀柔区");19         List<Friend> friends1=new ArrayList<Friend>();20         Friend f11=new Friend("李四",20,"北京市新城区");21         friends1.add(f11);22         Friend f12=new Friend("王五",18,"北京市朝阳区");23         friends1.add(f12);24         student1.setFriends(friends1);25         list.add(student1);26         // 第二个Student27         Student student2 = new Student("李四", 18, "男", new Date(), "北京市怀柔区");28         List<Friend> friends2 = new ArrayList<Friend>();29         Friend f21 = new Friend("张三", 20, "北京市新城区");30         friends2.add(f21);31         Friend f22 = new Friend("赵六", 18, "北京市朝阳区");32         friends2.add(f22);33         student2.setFriends(friends2);34         list.add(student2);35         //添加到Students36         students.setStudents(list);37         38         //打印到控制台39         FileWriter writer=new FileWriter(new File("students.xml"));40         marshaller.marshal(students, writer);41         marshaller.marshal(students, System.out);42     }43     44     /**45      * 读取xml文档,并将xml文档反序列化为java对象46      * @throws Exception47      */48     @Test49     public void testUnMarshaller() throws Exception{50         JAXBContext context = JAXBContext.newInstance(Students.class);51         Unmarshaller unmarshaller = context.createUnmarshaller();52         File f=new File("students.xml");53         Students students = (Students) unmarshaller.unmarshal(f);54         List<Student> list = students.getStudents();55         for(Student student:list){56             System.out.println("name:"+student.getName());57             System.out.println("age:"+student.getAge());58             System.out.println("address:"+student.getAddress());59             System.out.println("-----------------------");60         }61     }62 }

输出保存的students.xml:

 1 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 2 <students> 3     <student age="19"> 4         <address>北京市怀柔区</address> 5         <birthday>2016-10-15T14:59:45.126+08:00</birthday> 6         <friends> 7             <friend age="20"> 8                 <address>北京市新城区</address> 9                 <name>李四</name>10             </friend>11             <friend age="18">12                 <address>北京市朝阳区</address>13                 <name>王五</name>14             </friend>15         </friends>16         <name>张三</name>17         <sex>男</sex>18     </student>19     <student age="18">20         <address>北京市怀柔区</address>21         <birthday>2016-10-15T14:59:45.126+08:00</birthday>22         <friends>23             <friend age="20">24                 <address>北京市新城区</address>25                 <name>张三</name>26             </friend>27             <friend age="18">28                 <address>北京市朝阳区</address>29                 <name>赵六</name>30             </friend>31         </friends>32         <name>李四</name>33         <sex>男</sex>34     </student>35 </students>

 

XML编程总结(六)——使用JAXB进行java对象和xml格式之间的相互转换