欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JAXB XML和Java对象相互转化

程序员文章站 2022-03-19 16:05:01
JAXB XML和Java对象相互转化)Jaxb介绍Java SE中的JAXBJDK中JAXB相关的重要Class和Interface:JDK中JAXB相关的重要Annotation:java 程序Jaxb介绍​JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来...

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的组成部分。

JAXB相关的重要类与接口:

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

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

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

JAXB相关的注解:

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

java 程序

实体关系:假设如下。

  • 年级–>老师 一对多
  • 老师–>学生 一对多
package com.example.demo.jaxb.pojo;

import javax.xml.bind.annotation.*;
import java.util.List;

/**
 * Description: 年级实体
 */
@XmlRootElement(name = "gradeClass")
@XmlType(propOrder = {"className", "teachers"})
public class GradeClass {
    @XmlElement
    private String className;
    @XmlElement
    @XmlElementWrapper(name = "teacherList")
    private List<Teacher> teachers;

    @XmlTransient
    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    @XmlTransient
    public List<Teacher> getTeachers() {
        return teachers;
    }

    public void setTeachers(List<Teacher> teachers) {
        this.teachers = teachers;
    }
}

@XmlRootElement(name = “gradeClass”) 此批注定义XML文件的根元素。

@XmlType(propOrder = {“className”, “teachers”}) 用于定义XML文件中元素的顺序。不写则按照属性从上到下排列。

@XmlElement:用于定义XML文件中的元素,它设置实体名称。

@XmlElementWrapper(name =‘要赋予该包装器的名称’):它围绕XML表示形式生成一个包装器元素、。

@XmlTransient注解解决 JavaBean 属性名称与字段名称之间的名称冲突,或者用于防止字段/属性的映射

package com.example.demo.jaxb.pojo;

import javax.xml.bind.annotation.*;
import java.util.List;

/**
 * Description: 老师实体
 */
@XmlRootElement(namespace = "命名空间")
@XmlType(propOrder = {"name", "age","students"})
public class Teacher {
    @XmlElementWrapper(name = "studentList")
    @XmlElement(name = "students")
    private List<Student> students;
    /**
     * 名称
     */
    @XmlElement(name = "teacherName")
    private String name;
    /**
     * 年级
     */
    @XmlElement(name = "teacherAge")
    private String age;

    @XmlTransient
    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    @XmlTransient
    public List<Student> getStudents() {
        return students;
    }

    public void setStudents(List<Student> students) {
        this.students = students;
    }
    @XmlTransient
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

package com.example.demo.jaxb.pojo;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlTransient;

/**
 * Description:学生实体
 */
public class Student {
    /**
     * 编号
     */
    @XmlElement(name = "id")
    private String id;
    /**
     * 名称
     */
    @XmlElement(name = "studentName")
    private String name;
    /**
     * 年级
     */
    @XmlElement(name = "age")
    private String age;
    @XmlTransient
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
    @XmlTransient
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    @XmlTransient
    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}

java对象转化为xml:

package com.example.demo.test;

import com.example.demo.jaxb.pojo.GradeClass;
import com.example.demo.jaxb.pojo.Student;
import com.example.demo.jaxb.pojo.Teacher;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.io.File;
import java.util.ArrayList;

/**
 * Description: 测试
 */
public class JaxbTest {
    /**
     * java对象转化为xml
     * @param args 参数
     */
    public static void main(String[] args) {

        Student student = new Student();
        student.setId("1");
        student.setAge("11");
        student.setName("小明");
        Student student2 = new Student();
        student2.setId("2");
        student2.setAge("12");
        student2.setName("小红");
        Student student3 = new Student();
        student3.setId("3");
        student3.setAge("13");
        student3.setName("小王");
        Student student4 = new Student();
        student4.setId("4");
        student4.setAge("14");
        student4.setName("小刘");
        ArrayList<Student> studentArrayList = new ArrayList<>();
        studentArrayList.add(student);
        studentArrayList.add(student2);
        studentArrayList.add(student3);
        studentArrayList.add(student4);

        Teacher teacher = new Teacher();
        teacher.setName("小李老师");
        teacher.setAge("18");
        teacher.setStudents(studentArrayList);
        Teacher teacher2 = new Teacher();
        teacher2.setName("小赵老师");
        teacher2.setAge("88");
        teacher2.setStudents(null);
        ArrayList<Teacher> teacherArrayList = new ArrayList<>();
        teacherArrayList.add(teacher);
        teacherArrayList.add(teacher2);

        GradeClass gradeClass = new GradeClass();
        gradeClass.setClassName("一年级");
        gradeClass.setTeachers(teacherArrayList);

        try {
            //创建JAXB上下文
            JAXBContext jaxbContext = JAXBContext.newInstance(GradeClass.class);
            //创建编组对象
            Marshaller marshaller = jaxbContext.createMarshaller();
            //XML格式
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,Boolean.TRUE);
            File xMLFile = new File("D:\\Jaxb.xml");
            //编组
            marshaller.marshal(gradeClass, xMLFile);
            //控制台输出
            marshaller.marshal(gradeClass, System.out);

        } catch (JAXBException e) {
            e.printStackTrace();
        }

    }
}

运行以上程序后,将得到以下输出.

控制台输出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<gradeClass xmlns:ns2="命名空间">
    <className>一年级</className>
    <teacherList>
        <teachers>
            <teacherName>小李老师</teacherName>
            <teacherAge>18</teacherAge>
            <studentList>
                <students>
                    <id>1</id>
                    <studentName>小明</studentName>
                    <age>11</age>
                </students>
                <students>
                    <id>2</id>
                    <studentName>小红</studentName>
                    <age>12</age>
                </students>
                <students>
                    <id>3</id>
                    <studentName>小王</studentName>
                    <age>13</age>
                </students>
                <students>
                    <id>4</id>
                    <studentName>小刘</studentName>
                    <age>14</age>
                </students>
            </studentList>
        </teachers>
        <teachers>
            <teacherName>小赵老师</teacherName>
            <teacherAge>88</teacherAge>
        </teachers>
    </teacherList>
</gradeClass>

xml转化为java对象

package com.example.demo.test;

import com.example.demo.jaxb.pojo.GradeClass;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import java.io.File;

/**
 * Description:xml转化为java对象
 */
public class XMLToJavaTest {
    /**
     * xml转化为java对象
     */
    public static void main(String[] args) {
        try {
            JAXBContext jaxbContext = JAXBContext.newInstance(GradeClass.class);
            Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
            File xMLFile = new File("D:\\Jaxb.xml");
            //解组
            GradeClass gradeClass = (GradeClass) jaxbUnmarshaller.unmarshal(xMLFile);
            System.out.println("gradeClass.getClassName: " + gradeClass.getClassName());
            System.out.println(gradeClass.toString());
        } catch (JAXBException e) {
            // some exception occured
            e.printStackTrace();
        }
    }
}

可以打断点进行查看,比较明显。控制台显示如下:

gradeClass.getClassName: 一年级
com.example.demo.jaxb.pojo.GradeClass@7ce6a65d

本文地址:https://blog.csdn.net/weixin_45823828/article/details/111930242

相关标签: xml java