组件使用总结:使用 JAXB 实现 XML文件和java对象互转

栏目: Java · 发布时间: 5年前

内容简介:基础POJO类ClassRoomModel包含一个变量name和变量StudentModel列表待转化classroom.xml测试类JAXBManager: 创建JAXBContext对象,根据JAXBContext对象创建Unmarshaller 对象,使用Unmarshaller 对象实现将xml转化为ClassRoomModel对象。 根据JAXBContext对象创建Marshaller 对象,使用Marshaller 实现将ClassRoomModel 对象转化为xml文件
JAXB是一个业界的标准,实现XML文件和 Java 对象的互转。
JAXB是JDK 的组成部分。我们不需要下载第三方jar包 即可做到轻松转换。
复制代码

重要类和接口:

○ JAXBContext类,是应用的入口,用于管理XML/Java绑定信息。
	○ Marshaller接口,将Java对象序列化为XML数据。
	○ Unmarshaller接口,将XML数据反序列化为Java对象。
复制代码

注解

从XML到Java对象的注解:
	○ @XmlType: 
	○ @XmlElement :将java对象的属性映射为xml的节点
	○ @XmlRootElement:此类对应xml的根元素
	○ @XmlAttribute :把java对象的属性映射为xml的属性
	○ @XmlAccessorType :用于指定由java对象生成xml文件时对java对象属性的访问方式
	○ @XmlJavaTypeAdapter :在转换比较复杂的对象时,如map类型或者格式化日期等。使用此注解时,需要自己写一个XmlAdapter类
从Java对象到XML的注解:
	○ @XmlAccessorOrder :对java对象生成的xml元素进行排序
	○ @XmlTransient :定义某一字段或属性不需要被映射为XML
	○ @XmlElementWrapper :为数组元素或集合元素定义一个父节点
复制代码

工程实现

demo1:演示xml基本用法,演示@XmlRootElement 、@XmlAccessorType、@XmlElement的用法

基础POJO类ClassRoomModel包含一个变量name和变量StudentModel列表

public class StudentModel {
    private int id; // 学号
    private String name; // 名称
    private String sex; // 性别
}

@XmlRootElement(name = "classRoom")
@XmlAccessorType(value = XmlAccessType.FIELD)
public class ClassRoomModel {
    @XmlElement(name="name")
    private String name;

    @XmlElement(name="student")
    private List<StudentModel> studentModelList;
}
复制代码

待转化classroom.xml

<?xml version="1.0" encoding="UTF-8"?>
<classRoom>
    <name>配置总名称</name>
    <student>
        <id>1</id>
        <name>张三</name>
        <sex>男</sex>
    </student>
    <student>
        <id>2</id>
        <name>李四</name>
        <sex>女</sex>
    </student>
</classRoom>

复制代码

测试类JAXBManager: 创建JAXBContext对象,根据JAXBContext对象创建Unmarshaller 对象,使用Unmarshaller 对象实现将xml转化为ClassRoomModel对象。 根据JAXBContext对象创建Marshaller 对象,使用Marshaller 实现将ClassRoomModel 对象转化为xml文件

JAXBContext jaxbContext = JAXBContext.newInstance(ClassRoomModel.class);
// 从xml文件中读取,并转化为java对象
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
InputStream classRoomInputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("com/hry/java/xml/classroom.xml");
System.out.println(JAXBManager.class.getClassLoader().getResource(""));
System.out.println(Thread.currentThread().getContextClassLoader().getResource(""));

ClassRoomModel classRoomModel = (ClassRoomModel)unmarshaller.unmarshal(classRoomInputStream);
System.out.println(JSON.toJSONString(classRoomModel));

// 保存文件,将Java对象转化为xml文件
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.marshal(classRoomModel, new File("classroon-save.xml"));

复制代码

demo2: 演示@XmlAttribute、@XmlJavaTypeAdapter、XmlAdapter用法

基础POJO类:ClassRoomModel2包含一个变量name和变量StudentModel列表 此demo和上面的类不同,StudentModel2 是使用@XmlAttribute通过xml元素的属性注入值,另外增加属性Date对象

@XmlAccessorType(value = XmlAccessType.FIELD)
public class StudentModel2 {
    @XmlAttribute(name = "id")
    private int id; // 学号
    @XmlAttribute(name = "name")
    private String name; // 名称
    @XmlAttribute(name = "sex")
    private String sex; // 性别
    @XmlAttribute(name = "birthDate")
    @XmlJavaTypeAdapter(value = DateXmlAdapter.class) // 配置日期转化器
    private Date birthDate; // 生日
}

@XmlRootElement(name = "classRoom")
@XmlAccessorType(value = XmlAccessType.FIELD)
public class ClassRoomModel2 {
    @XmlElement(name="name")
    private String name;

    @XmlElement(name="student")
    private List<StudentModel2> studentModelList;
}
复制代码

待转化xml文件

<?xml version="1.0" encoding="UTF-8"?>
<classRoom>
    <name>配置总名称</name>
    <student id="1" name="张三" sex="男" birthDate="1999-10-22" />
    <student id="2" name="李四" sex="女" birthDate="1997-12-23"  />
</classRoom>
复制代码

XmlAdapter用法:StudentModel2 里的成员变量birthDate的新注解@XmlJavaTypeAdapter(value = DateXmlAdapter.class),实现日期String和Date的相互转化

public class DateXmlAdapter extends XmlAdapter<String, Date> {
    // 时间
    private static final ThreadLocal<SimpleDateFormat> simpleDateFormatThreadLocalYYYYMMDD = new ThreadLocal<SimpleDateFormat>(){
        @Override
        protected SimpleDateFormat initialValue() {
            return new SimpleDateFormat("yyyy-MM-dd");
        }
    };

    @Override
    public Date unmarshal(String v) throws Exception {
        System.out.println(v);
        return simpleDateFormatThreadLocalYYYYMMDD.get().parse(v);
    }

    @Override
    public String marshal(Date v) throws Exception {
        System.out.println(v);
        return simpleDateFormatThreadLocalYYYYMMDD.get().format(v);
    }
}

复制代码

测试类JAXBManager:用法和第一个demo相同,详细见代码

public static void main(String[] args){
        try {
            JAXBContext jaxbContext = JAXBContext.newInstance(ClassRoomModel2.class);

            // 从xml文件中读取,并转化为java对象
            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

            InputStream classRoomInputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("com/hry/java/xml/classroom2.xml");
            System.out.println(JAXBManager2.class.getClassLoader().getResource(""));
            System.out.println(Thread.currentThread().getContextClassLoader().getResource(""));

            ClassRoomModel2 classRoomModel = (ClassRoomModel2)unmarshaller.unmarshal(classRoomInputStream);
            System.out.println(JSON.toJSONString(classRoomModel));

            // 保存文件,将Java对象转化为xml文件
            Marshaller marshaller = jaxbContext.createMarshaller();
            marshaller.marshal(classRoomModel, new File("classroon-save2.xml"));

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

复制代码

异常处理

如果不在类加上@XmlAccessorType(value = XmlAccessType.FIELD),则可能抛出如下异常。@XmlAccessorType的默认访问级别是XmlAccessType.PUBLIC_MEMBER,因此,如果java对象中的private成员变量设置了public权限的getter/setter方法,就不要在private变量上使用@XmlElement和@XmlAttribute注解,否则在由java对象生成xml时会报同一个属性在java类里存在两次的错误,异常如下:

com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions
类的两个属性具有相同名称 "name"
	this problem is related to the following location:
		at public java.lang.String com.hry.java.xml.model.ClassRoomModel.getName()
		at com.hry.java.xml.model.ClassRoomModel
	this problem is related to the following location:
		at private java.lang.String com.hry.java.xml.model.ClassRoomModel.name
at com.hry.java.xml.model.ClassRoomModel
复制代码

以上所述就是小编给大家介绍的《组件使用总结:使用 JAXB 实现 XML文件和java对象互转》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

数据结构与算法

数据结构与算法

BrunoRPreiss / 电子工业出版社 / 2003-1 / 55.00元

本书是作者根据他在滑铁卢大学计算机工程学院教授数据结构与算法课程的经验编写而成的。它采用C++面向对象的设计模式,不仅系统全面地介绍了各种传统的数据结构,还把它们按照类和类层次的现代理念予以展开,进而达到抽象结构与实际设计的完美统一。本书的后三章通过引入抽象问题求解的概念,集中讲述了算法技术和各算法之间的关系。另外,作者运用一定的数学工具以及必要的分析技术和分析理论,对每种数据结构及相关算法都进行一起来看看 《数据结构与算法》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具