博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
组件使用总结:使用 JAXB 实现 XML文件和java对象互转
阅读量:6278 次
发布时间:2019-06-22

本文共 5759 字,大约阅读时间需要 19 分钟。

JAXB

JAXB:实现xml和java对象互转

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
studentModelList;}复制代码

待转化classroom.xml

配置总名称
1
张三
2
李四
复制代码

测试类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
studentModelList;}复制代码

待转化xml文件

配置总名称
复制代码

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

public class DateXmlAdapter extends XmlAdapter
{ // 时间 private static final ThreadLocal
simpleDateFormatThreadLocalYYYYMMDD = new ThreadLocal
(){ @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.nameat com.hry.java.xml.model.ClassRoomModel复制代码

代码

以上的详细代码见这里

转载地址:http://gcfva.baihongyu.com/

你可能感兴趣的文章
【前端词典】实现 Canvas 下雪背景引发的性能思考
查看>>
大佬是怎么思考设计MySQL优化方案的?
查看>>
<三体> 给岁月以文明, 给时光以生命
查看>>
Android开发 - 掌握ConstraintLayout(九)分组(Group)
查看>>
springboot+logback日志异步数据库
查看>>
Typescript教程之函数
查看>>
Android 高效安全加载图片
查看>>
vue中数组变动不被监测问题
查看>>
3.31
查看>>
类对象定义 二
查看>>
收费视频网站Netflix:用户到底想要“点”什么?
查看>>
MacOS High Sierra 12 13系统转dmg格式
查看>>
关于再次查看已做的多选题状态逻辑问题
查看>>
动态下拉菜单,非hover
查看>>
政府安全资讯精选 2017年第十六期 工信部发布关于规范互联网信息服务使用域名的通知;俄罗斯拟建立备用DNS;Google打击安卓应用在未经同意情况下收集个人信...
查看>>
简单易懂的谈谈 javascript 中的继承
查看>>
多线程基础知识
查看>>
iOS汇编基础(四)指针和macho文件
查看>>
Laravel 技巧锦集
查看>>
Android 使用 ViewPager+RecyclerView+SmartRefreshLayout 实现顶部图片下拉视差效果
查看>>