zoukankan      html  css  js  c++  java
  • 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     @XmlAttribute
    30     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     @XmlAttribute
    25     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对象进行转换成xml
    15         Students students=new Students();
    16         List<Student> list=new ArrayList<Student>();
    17         //第一个Student
    18         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         // 第二个Student
    27         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         //添加到Students
    36         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 Exception
    47      */
    48     @Test
    49     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>
  • 相关阅读:
    分布式与集群的区别是什么?
    Java NIO:IO与NIO的区别 JAVA BIO与NIO、AIO的区别
    localStorage使用总结 JS 详解 Cookie、 LocalStorage 与 SessionStorage
    tomcat+nginx+redis实现均衡负载、session共享 存储过程的优缺点 HTTP、TCP、IP协议常见面试题
    高并发下的Java数据结构(List、Set、Map)
    [剑指offer] 31. 整数中1出现的次数(从1到n整数中1出现的次数)
    [剑指offer] 30. 连续子数组的最大和
    [剑指offer] 29. 最小的K个数
    [剑指offer] 28. 数组中出现次数超过一半的数字
    [leetcode] 51. N-Queens (递归)
  • 原文地址:https://www.cnblogs.com/techlogy/p/5965118.html
Copyright © 2011-2022 走看看