(六)使用JAXB进行java对象和xml格式之间的相互转换

JAXB能够使用Jackson对JAXB注解的支持实现(jackson-module-jaxb-annotations),既方便生成XML,也方便生成JSON,这样一来可以更好的标志可以转换为JSON对象的JAVA类。

JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。

JDK中JAXB相关的重要Class和Interface:

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

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

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

JDK中JAXB相关的重要Annotation:注解不能使用在字段上,只能使用在getter/setter方法上

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

测试代码:

Student.java:

1 public classStudent {2 privateString name;3 private intage;4 privateString sex;5 privateDate birthday;6 privateString address;7 private Listfriends;8

9 publicStudent() {10 }11

12 public Student(String name, intage, String sex, Date birthday, String address) {13 this.name =name;14 this.age =age;15 this.sex =sex;16 this.birthday =birthday;17 this.address =address;18 }19

20 publicString getName() {21 returnname;22 }23

24 public voidsetName(String name) {25 this.name =name;26 }27

28 //将age字段变成student的一个属性

29 @XmlAttribute30 public intgetAge() {31 returnage;32 }33

34 public void setAge(intage) {35 this.age =age;36 }37

38 publicString getSex() {39 returnsex;40 }41

42 public voidsetSex(String sex) {43 this.sex =sex;44 }45

46 publicDate getBirthday() {47 returnbirthday;48 }49

50 public voidsetBirthday(Date birthday) {51 this.birthday =birthday;52 }53

54 publicString getAddress() {55 returnaddress;56 }57

58 public voidsetAddress(String address) {59 this.address =address;60 }61

62 //指定用标签包围,子标签为

63 @XmlElementWrapper(name="friends")64 @XmlElement(name="friend")65 public ListgetFriends() {66 returnfriends;67 }68

69 public void setFriends(Listfriends) {70 this.friends =friends;71 }72 }

Friend.java:

1 public classFriend {2

3 privateString name;4 private intage;5 privateString address;6

7 publicFriend() {8 }9

10 public Friend(String name,intage,String address) {11 this.name =name;12 this.age=age;13 this.address=address;14 }15

16 publicString getName() {17 returnname;18 }19

20 public voidsetName(String name) {21 this.name =name;22 }23

24 @XmlAttribute25 public intgetAge() {26 returnage;27 }28

29 public void setAge(intage) {30 this.age =age;31 }32

33 publicString getAddress() {34 returnaddress;35 }36

37 public voidsetAddress(String address) {38 this.address =address;39 }40 }

Students.java:

1 @XmlRootElement(name="students")2 public classStudents {3

4 private Liststudents;5

6 @XmlElement(name="student")7 public ListgetStudents() {8 returnstudents;9 }10

11 public void setStudents(Liststudents) {12 this.students =students;13 }14 }

JAXBTest.java:

1 public classJAXBTest {2

3 /**

4 * 将java对象转换成xml,并用注解指定生成规则,是生成属性还是生成节点5 *@throwsException6 */

7 @Test8 public void testMarshaller() throwsException{9 //获得转换的上下文对象

10 JAXBContext context = JAXBContext.newInstance(Students.class);11 //获得Marshaller对象

12 Marshaller marshaller =context.createMarshaller();13 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);14 //将java对象进行转换成xml

15 Students students=newStudents();16 List list=new ArrayList();17 //第一个Student

18 Student student1=new Student("张三",19,"男",new Date(),"北京市怀柔区");19 List friends1=new ArrayList();20 Friend f11=new Friend("李四",20,"北京市新城区");21 friends1.add(f11);22 Friend f12=new Friend("王五",18,"北京市朝阳区");23 friends1.add(f12);24 student1.setFriends(friends1);25 list.add(student1);26 //第二个Student

27 Student student2 = new Student("李四", 18, "男", new Date(), "北京市怀柔区");28 List friends2 = new ArrayList();29 Friend f21 = new Friend("张三", 20, "北京市新城区");30 friends2.add(f21);31 Friend f22 = new Friend("赵六", 18, "北京市朝阳区");32 friends2.add(f22);33 student2.setFriends(friends2);34 list.add(student2);35 //添加到Students

36 students.setStudents(list);37

38 //打印到控制台

39 FileWriter writer=new FileWriter(new File("students.xml"));40 marshaller.marshal(students, writer);41 marshaller.marshal(students, System.out);42 }43

44 /**

45 * 读取xml文档,并将xml文档反序列化为java对象46 *@throwsException47 */

48 @Test49 public void testUnMarshaller() throwsException{50 JAXBContext context = JAXBContext.newInstance(Students.class);51 Unmarshaller unmarshaller =context.createUnmarshaller();52 File f=new File("students.xml");53 Students students =(Students) unmarshaller.unmarshal(f);54 List list =students.getStudents();55 for(Student student:list){56 System.out.println("name:"+student.getName());57 System.out.println("age:"+student.getAge());58 System.out.println("address:"+student.getAddress());59 System.out.println("-----------------------");60 }61 }62 }

输出保存的students.xml:

1 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>

2

3

4

北京市怀柔区

5 2016-10-15T14:59:45.126+08:00

6

7

8

北京市新城区

9 李四

10

11

12

北京市朝阳区

13 王五

14

15

16 张三

17 男

18

19

20

北京市怀柔区

21 2016-10-15T14:59:45.126+08:00

22

23

24

北京市新城区

25 张三

26

27

28

北京市朝阳区

29 赵六

30

31

32 李四

33 男

34

35

jaxb java xml序列化_XML编程总结(六)——使用JAXB进行java对象和xml格式之间的相互转换...相关推荐

  1. Java:计算机编程语言Java的简介、编程环境/工具、如何学习Java之详细攻略

    Java:计算机编程语言Java的简介.编程环境/工具.如何学习Java之详细攻略 目录 Java的简介 1.Java的工作原理--基于Eclipse等编程Java语言→定义Java类→Java虚拟机 ...

  2. XML编程总结(七)——使用XPath对象查询xml文档

    (七)使用XPath对象查询xml文档 XPath,一种为查询 XML 文档而设计的查询语言.XPath 并不是 Java 语言,事实上 XPath 不是一种完整的编程语言.有很多东西用 XPath ...

  3. java语言用什么编程_使用什么编程语言开发Java?

    The Java Language is a language specification – you don't write a language in a language, it's a spe ...

  4. 【Java学习笔记之二十六】深入理解Java匿名内部类

    在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...

  5. java timer 序列化_编程达人 应用层timer_如何序列化timer

    本文摘自    https://www.cnblogs.com/embedded-linux/p/9093990.html 应用层使用timer可以启动多个timer(每个timer管理一个目标时间) ...

  6. 云计算 java go c_面向对象编程的面向过程表示:c java go

    题目就这么抽象~.~其实一点都不抽象,老师以前也说过吧,面向对象就是建立在面向过程的基础上的. 下面这些主要是能让大家吸收一些较新鲜的编程思路,对于嵌入式编程大有裨益,对理解面向对象的底层封装全新的认 ...

  7. java和python混合编程_浅谈C++与Java混合编程

    在学习编程的过程中, 我觉得不止要获得课本的知识, 更多的是通过学习技术知识提高解决问题的能力, 这样我们才能走在最前方, 更 多 Java 学习,请登陆疯狂 java 官网. 现实的情况是, 真实的 ...

  8. java马士兵网络编程_学习笔记-马士兵java - 网络编程

    1. 网络基础 a. 计算机网络:把分布在不同地理区域的计算机与专门的外部设备用通信线路互联成一个规模大.功能强的网络系统,从而使众多的计算机可以方便地相互传递信息,共享硬件.软件.数据信息等资源. ...

  9. java xml开源操作类,xml解析和操作的开源工具项目涵盖java c++ php 等语言

    XML解析器-Xerces    XML操作库-dom4j    XML文档解析器-Digester    J2ME-的XML-解析器-kXML XML解析类库-MXP1    XML解析器-LibX ...

最新文章

  1. 最短路径·三:SPFA算法 HihoCoder - 1093 (spfa无向图)
  2. matlab去除坏点,图像处理之坏点校正及源码实现
  3. mysql查询时给字段加内容,mysql数据库查询之对应库对应表中的注释信息查询以及加字段查询...
  4. 如何使用python效率办公_日常office工作中如何用python提升效率014
  5. jquery的$.each和$().each
  6. 在Windows上运行单节点的Cassandra
  7. JDK7新特性简单翻译介绍
  8. [原创] Android SDK 安装全记录
  9. Anaconda+vscode+pytorch环境搭建
  10. java 异步读写_Java异步与AIO
  11. shell 写入文件_phpMyAdmin利用日志文件GetSHELL
  12. Linux的Open Files设置过小导致程序退出并且Unable to create new native thread
  13. 鸿蒙第三代手机,荣耀Magic 3最新确认,鸿蒙系统+双6400万,最期待的荣耀来了
  14. FPGA学习笔记---3种乘法器的比较
  15. centos安装rpm格式jdk
  16. JAVA 配置文件 路径_Java配置文件读取和路径设置
  17. 完成端口(Completion Port)详解
  18. ×××全功能邮件系统(3)
  19. UTI ( Uniform Type Identifier )
  20. 【博弈论】Nim游戏/Nim博弈及其异或的详细易懂理解

热门文章

  1. 没有事情,错误1503_为什么依靠用户报告错误是您做过的最愚蠢的事情
  2. 一文搞定Python正则表达式
  3. 终于来了!Python 编辑神器 Jupyter ,推出首款官方可视化 Debug 工具!
  4. urllib2:URLError与HTTPError
  5. 原版英文书籍《Linux命令行》阅读记录7 | 原版英文书籍《Linux命令行》阅读记录7 | 一些键盘按键技巧...
  6. java web项目中的根路径踩坑
  7. 数学-矩阵计算(1)矩阵和向量的求导法则
  8. reportviewer动态数据源
  9. javascript框架比较(二)
  10. Python《回车桌面图片》