首页 > 代码库 > 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格式之间的相互转换