JAXB XML和Java对象相互转化
JAXB XML和Java对象相互转化)
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