XML编程总结(六)——使用JAXB进行java对象和xml格式之间的相互转换

(六)使用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 class Student {
 2     private String name;
 3     private int age;
 4     private String sex;
 5     private Date birthday;
 6     private String address;
 7     private List<Friend> friends;
 8
 9     public Student() {
10     }
11
12     public Student(String name, int age, 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     public String getName() {
21         return name;
22     }
23
24     public void setName(String name) {
25         this.name = name;
26     }
27
28     //将age字段变成student的一个属性
29     @XmlAttribute
30     public int getAge() {
31         return age;
32     }
33
34     public void setAge(int age) {
35         this.age = age;
36     }
37
38     public String getSex() {
39         return sex;
40     }
41
42     public void setSex(String sex) {
43         this.sex = sex;
44     }
45
46     public Date getBirthday() {
47         return birthday;
48     }
49
50     public void setBirthday(Date birthday) {
51         this.birthday = birthday;
52     }
53
54     public String getAddress() {
55         return address;
56     }
57
58     public void setAddress(String address) {
59         this.address = address;
60     }
61
62     //指定用<friends>标签包围,子标签为<friend>
63     @XmlElementWrapper(name="friends")
64     @XmlElement(name="friend")
65     public List<Friend> getFriends() {
66         return friends;
67     }
68
69     public void setFriends(List<Friend> friends) {
70         this.friends = friends;
71     }
72 }

Friend.java:

 1 public class Friend {
 2
 3     private String name;
 4     private int age;
 5     private String address;
 6
 7     public Friend() {
 8     }
 9
10     public Friend(String name,int age,String address) {
11         this.name = name;
12         this.age=age;
13         this.address=address;
14     }
15
16     public String getName() {
17         return name;
18     }
19
20     public void setName(String name) {
21         this.name = name;
22     }
23
24     @XmlAttribute
25     public int getAge() {
26         return age;
27     }
28
29     public void setAge(int age) {
30         this.age = age;
31     }
32
33     public String getAddress() {
34         return address;
35     }
36
37     public void setAddress(String address) {
38         this.address = address;
39     }
40 }

Students.java:

 1 @XmlRootElement(name="students")
 2 public class Students {
 3
 4     private List<Student> students;
 5
 6     @XmlElement(name="student")
 7     public List<Student> getStudents() {
 8         return students;
 9     }
10
11     public void setStudents(List<Student> students) {
12         this.students = students;
13     }
14 }

JAXBTest.java:

 1 public class JAXBTest {
 2
 3     /**
 4      * 将java对象转换成xml,并用注解指定生成规则,是生成属性还是生成节点
 5      * @throws Exception
 6      */
 7     @Test
 8     public void testMarshaller() throws Exception{
 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=new Students();
16         List<Student> list=new ArrayList<Student>();
17         //第一个Student
18         Student student1=new Student("张三",19,"男",new Date(),"北京市怀柔区");
19         List<Friend> friends1=new ArrayList<Friend>();
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<Friend> friends2 = new ArrayList<Friend>();
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      * @throws Exception
47      */
48     @Test
49     public void testUnMarshaller() throws Exception{
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<Student> 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 <students>
 3     <student age="19">
 4         <address>北京市怀柔区</address>
 5         <birthday>2016-10-15T14:59:45.126+08:00</birthday>
 6         <friends>
 7             <friend age="20">
 8                 <address>北京市新城区</address>
 9                 <name>李四</name>
10             </friend>
11             <friend age="18">
12                 <address>北京市朝阳区</address>
13                 <name>王五</name>
14             </friend>
15         </friends>
16         <name>张三</name>
17         <sex>男</sex>
18     </student>
19     <student age="18">
20         <address>北京市怀柔区</address>
21         <birthday>2016-10-15T14:59:45.126+08:00</birthday>
22         <friends>
23             <friend age="20">
24                 <address>北京市新城区</address>
25                 <name>张三</name>
26             </friend>
27             <friend age="18">
28                 <address>北京市朝阳区</address>
29                 <name>赵六</name>
30             </friend>
31         </friends>
32         <name>李四</name>
33         <sex>男</sex>
34     </student>
35 </students>
时间: 2024-10-13 16:04:05

XML编程总结(六)——使用JAXB进行java对象和xml格式之间的相互转换的相关文章

使用JAXB实现JAVA对象和XML字符串的互相转换实例

测试类: package com.yanek.test; import java.util.ArrayList; import java.util.List; import com.yanek.test.JaxbUtil.CollectionWrapper; public class Test { /** * @param args */ public static void main(String[] args) { //创建java对象 Hotel hotel=new Hotel(); ho

JAXB实现java对象与xml之间转换

JAXB简介: 1.JAXB能够使用Jackson对JAXB注解的支持实现(jackson-module-jaxb-annotations),既方便生成XML,也方便生成JSON,这样一来可以更好的标志可以转换为JSON对象的JAVA类.JAXB允许JAVA人员将JAVA类映射为XML表示方式,常用的注解包括:@XmlRootElement,@XmlElement等等. 2.JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML S

JAXB 实现java对象与xml之间互相转换

首先熟悉一下JAXB实现对象与xml互转时常用的一些注解使用: [email protected],用于类级别的注解,对应xml的跟元素.通过name属性定义这个根节点的名称. [email protected],定义映射这个类中的何种类型都需要映射到xml.(如果不存在@XmlAccessorType,默认使用XmlAccessType.PUBLIC_MEMBER注解) 参数:XmlAccessType.FIELD: java对象中的所有成员变量. XmlAccessType.PROPERTY

通过JAXB完成Java对象与XML之间的转换

Java对象转换XML的过程叫marshal. XML转换到Java对象的过程叫unmarshal. 一.Java对象转化为XML 这里省略getter和setter方法 通过标注@XMLRootElement用于标注XML的根元素.这个类的所有属性默认映射为根元素的子元素. 运行代码后,将生成一个D:\test.xml文件,其数据为 二.XML转化为Java对象 代码运行如下 三.更为复杂的映射 将XML中数据读到ArticleData中,类中有一个List,保存每条article数据

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

(七)使用XPath对象查询xml文档 XPath,一种为查询 XML 文档而设计的查询语言.XPath 并不是 Java 语言,事实上 XPath 不是一种完整的编程语言.有很多东西用 XPath 表达不出来,甚至有些查询也无法表达.幸运的是,可以把 XPath 结合到 Java 程序中,这样就能发挥两者的优势了:Java 做 Java 所擅长的,XPath 做 XPath 所擅长的.Java 程序执行 XPath 查询所需要的应用程序编程接口(API)还因形形色色的 XPath 引擎而各不相

JAVA对象和XML文档、原来他们之间还有这一出

最近项目开发中遇到一个问题,访问接口不再通过url地址请求的方式,而是 通过socket发送xml格式的报文到指定服务器来进行信息的统一认证.. 因此组装xml格式的报文字符串以及解析服务器返回的xml格式的字符获得所需数据成了 解决问题的关键..在这之前,以为会有点难...做完之后,然并卵,也就那么一回事... LZ主要用的xStream类..这个类的完美地解决了XML文档和JAVA对象之间的转换.. 由于刚刚接触这个类...对于里面提供的很多功能还没细细挖掘..只是简单地实现了 我想要实现的

总结学习! xml与java对象转换 --- JDK自带的JAXB(Java Architecture for XML Binding)

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

java socket报文通信(三)java对象和xml格式文件的相互转换

前两节讲了socket服务端,客户端的建立以及报文的封装.今天就来讲一下java对象和xml格式文件的相互转换. 上一节中我们列举了一个报文格式,其实我们可以理解为其实就是一个字符串.但是我们不可能每次都去写字符串啊,这样的话肯定要疯.既然是面向对象的编程,肯定会有好的办法来解决这个问题.我们使用JAXBContext这个工具. package cn.com.egj.entity.shortcutTransfer.test; import java.io.BufferedReader; impo

使用XStream注解实现Java对象与XML互相转换的代码示例

本文记录一下使用xstream这个api的注解特性对Java对象与XML字符串相互转换的一些代码示例.    我们很多人都处理过XML文件,也有很多非常成熟的第三方开源软件.如:jdom.dom4j等.虽然他们的功能非常强大,但在使用上还是有点不那么习惯.对于格式比较固定的XML文档,它的结构没有变化或是很少变化,这时将它转换成我们熟悉的Java对象来操作的话,会使工作变得更容易一些,而xstream正好可以满足这一点.    本文所用xstream的版本为:1.4.7 <dependency>