课程咨询 :186 8716 1620      qq:2066486918

昆明Java培训 > java教程 > XML编程:使用JAXB进行java对象和xml格式之间的相互转换
  • XML编程:使用JAXB进行java对象和xml格式之间的相互转换

    发布:昆明Java培训      来源:java教程      时间:2016-10-25

  • 昆明达内Java培训的老师这一期给大家讲使用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培训的老师今天的内容就讲到这里了,我们下一期又再见啰。

    推荐文章

上一篇:XML编程:使用StAX接口操作xml

下一篇:XML编程:使用XPath对象查询xml文档

最新开班日期  |  更多

Java--零基础全日制班

Java--零基础全日制班

开班日期:12/29

Java--零基础业余班

Java--零基础业余班

开班日期:12/29

Java--周末提升班

Java--周末提升班

开班日期:12/29

Java--零基础周末班

Java--零基础周末班

开班日期:12/29

  • 网址:http://km .java.tedu.cn      地址:昆明市官渡区春城路62号证券大厦附楼6楼
  • 课程培训电话:186 8716 1620      qq:2066486918    全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56