内容简介:基础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对象互转》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Container容器组件的使用
- 使用storybook管理React组件
- Khala路由组件介绍与使用
- react-组件类型及使用场景
- 使用Docker运行整套项目组件
- 使用storybook搭建私有组件库
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
疯狂Java讲义(第4版)
李刚 / 电子工业出版社 / 2018-1 / 109
《疯狂Java讲义(第4版)》是《疯狂Java讲义》的第4版,第4版保持了前3版系统、全面、讲解浅显、细致的特性,全面新增介绍了Java 9的新特性。 《疯狂Java讲义(第4版)》深入介绍了Java编程的相关方面,《疯狂Java讲义(第4版)》内容覆盖了Java的基本语法结构、Java的面向对象特征、Java集合框架体系、Java泛型、异常处理、Java GUI编程、JDBC数据库编程、J......一起来看看 《疯狂Java讲义(第4版)》 这本书的介绍吧!