JAXB

本文介绍了如何使用JAXB技术在Java中实现XML数据的序列化和反序列化,包括如何创建XML对象,如何将对象转换为XML格式,并详细解释了相关注解和类的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

JAXB 2.0是JDK 1.6的组成部分。JAXB 2.2.3是JDK 1.7的组成部分。

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

  JAXBContext类,是应用的入口,用于管理XML/Java绑定信息。  Marshaller接口,将Java对象序列化为XML数据。  Unmarshaller接口,将XML数据反序列化为Java对象。

JDK中JAXB相关的重要Annotation:

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

其他:

  对于要序列化(marshal)为XML的Java类,绝不能把成员变量声明为public,否则运行将抛出异常com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException。  对于JAXB相关的重要Annotation的声明,如@Xml.....,可以放在成员变量的setter()getter()方法上,两者中任选其一即可,但决不能放在成员变量上,否则运行将抛出异常com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException。


[代码] Customer.java

01package com.mkyong.core;
02  
03import javax.xml.bind.annotation.XmlAttribute;
04import javax.xml.bind.annotation.XmlElement;
05import javax.xml.bind.annotation.XmlRootElement;
06  
07@XmlRootElement
08public class Customer {
09  
10    String name;
11    int age;
12    int id;
13  
14    public String getName() {
15        return name;
16    }
17  
18    @XmlElement
19    public void setName(String name) {
20        this.name = name;
21    }
22  
23    public int getAge() {
24        return age;
25    }
26  
27    @XmlElement
28    public void setAge(int age) {
29        this.age = age;
30    }
31  
32    public int getId() {
33        return id;
34    }
35  
36    @XmlAttribute
37    public void setId(int id) {
38        this.id = id;
39    }
40  
41}

[代码]将对象转为XML

01package com.mkyong.core;
02  
03import java.io.File;
04import javax.xml.bind.JAXBContext;
05import javax.xml.bind.JAXBException;
06import javax.xml.bind.Marshaller;
07  
08public class JAXBExample {
09    public static void main(String[] args) {
10  
11      Customer customer = new Customer();
12      customer.setId(100);
13      customer.setName("mkyong");
14      customer.setAge(29);
15  
16      try {
17  
18        File file = new File("C:\\file.xml");
19        JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
20        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
21  
22        // output pretty printed
23        jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
24  
25        jaxbMarshaller.marshal(customer, file);
26        jaxbMarshaller.marshal(customer, System.out);
27  
28          } catch (JAXBException e) {
29        e.printStackTrace();
30          }
31  
32    }
33}

[代码] 输出

1<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2<customer id="100">
3    <age>29</age>
4    <name>mkyong</name>
5</customer>

[代码] 将XML转为对象

01package com.mkyong.core;
02  
03import java.io.File;
04import javax.xml.bind.JAXBContext;
05import javax.xml.bind.JAXBException;
06import javax.xml.bind.Unmarshaller;
07  
08public class JAXBExample {
09    public static void main(String[] args) {
10  
11     try {
12  
13        File file = new File("C:\\file.xml");
14        JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
15  
16        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
17        Customer customer = (Customer) jaxbUnmarshaller.unmarshal(file);
18        System.out.println(customer);
19  
20      } catch (JAXBException e) {
21        e.printStackTrace();
22      }
23  
24    }
25}

[代码] 输出

1Customer [name=mkyong, age=29, id=100]



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值