昆明java培训
达内昆明广州春城路

18487146383

热门课程

XML编程:使用JAXB进行java对象和xml格式之间的相互转换

  • 时间:2016-10-25
  • 发布:昆明Java培训
  • 来源:java教程

昆明达内Java培训的老师这一期给大家讲使用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>

昆明达内Java培训的老师今天的内容就讲到这里了,我们下一期又再见啰。

上一篇:XML编程:使用StAX接口操作xml
下一篇:XML编程:使用XPath对象查询xml文档

java IO流之字节流和字符流

java IO流之file类的常用操作

搭建james邮件服务器

Java识别操作系统

选择城市和中心
贵州省

广西省

海南省

扫一扫

了解更多干货