在Java生态中,JAXB(Java Architecture for XML Binding)是官方提供的用于XML和Java对象之间映射转换的框架,它可以通过注解配置实现两者的自动转换,减少了手动解析XML的繁琐工作。

JAXB核心注解说明
JAXB通过一系列注解来定义Java类和XML元素的映射关系,常用的注解如下:
- @XmlRootElement:标注在类上,指定该类对应XML的根元素。
- @XmlAccessorType:指定JAXB访问类属性的方式,常用值为XmlAccessType.FIELD,表示直接访问字段。
- @XmlElement:标注在字段或getter方法上,指定字段对应的XML子元素名称和属性。
- @XmlAttribute:标注在字段或getter方法上,指定字段对应XML元素的属性。
定义待转换的Java实体类
首先我们定义一个用户类,使用JAXB注解配置和XML的映射关系:
import javax.xml.bind.annotation.*;
@XmlRootElement(name = "user")
@XmlAccessorType(XmlAccessType.FIELD)
public class User {
@XmlAttribute(name = "id")
private Integer id;
@XmlElement(name = "name")
private String name;
@XmlElement(name = "age")
private Integer age;
@XmlElement(name = "email")
private String email;
// 必须提供无参构造器,JAXB反序列化时需要
public User() {
}
public User(Integer id, String name, Integer age, String email) {
this.id = id;
this.name = name;
this.age = age;
this.email = email;
}
// getter和setter方法
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}Java对象转换为XML(序列化)
使用JAXB的Marshaller类可以将Java对象转换为XML格式的数据,以下是具体实现代码:
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import java.io.StringWriter;
public class JavaToXmlDemo {
public static void main(String[] args) {
try {
// 创建用户对象
User user = new User(1, "张三", 25, "zhangsan@ipipp.com");
// 获取JAXB上下文,传入要转换的类
JAXBContext context = JAXBContext.newInstance(User.class);
// 创建序列化器
Marshaller marshaller = context.createMarshaller();
// 设置格式化输出,生成的XML会有缩进
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
// 设置编码格式
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
// 输出到字符串
StringWriter writer = new StringWriter();
marshaller.marshal(user, writer);
String xmlResult = writer.toString();
System.out.println("生成的XML内容:");
System.out.println(xmlResult);
} catch (Exception e) {
e.printStackTrace();
}
}
}运行上述代码后,会输出如下格式的XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<user id="1">
<name>张三</name>
<age>25</age>
<email>zhangsan@ipipp.com</email>
</user>XML转换为Java对象(反序列化)
使用JAXB的Unmarshaller类可以将XML数据转换为对应的Java对象,实现代码如下:
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
public class XmlToJavaDemo {
public static void main(String[] args) {
try {
// 待转换的XML字符串
String xmlContent = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" +
"<user id=\"1\">" +
"<name>张三</name>" +
"<age>25</age>
"<email>zhangsan@ipipp.com</email>" +
"</user>";
// 获取JAXB上下文
JAXBContext context = JAXBContext.newInstance(User.class);
// 创建反序列化器
Unmarshaller unmarshaller = context.createUnmarshaller();
// 将XML字符串转换为Java对象
StringReader reader = new StringReader(xmlContent);
User user = (User) unmarshaller.unmarshal(reader);
System.out.println("转换后的User对象信息:");
System.out.println("ID:" + user.getId());
System.out.println("姓名:" + user.getName());
System.out.println("年龄:" + user.getAge());
System.out.println("邮箱:" + user.getEmail());
} catch (Exception e) {
e.printStackTrace();
}
}
}注意事项
- 被JAXB转换的Java类必须提供无参构造器,否则反序列化时会抛出异常。
- 如果Java类的字段是私有的,且使用
@XmlAccessorType(XmlAccessType.FIELD)注解,不需要提供getter和setter方法也可以完成转换,但提供这些方法更符合JavaBean规范。 - JAXB在Java 9之后被标记为可选模块,如果使用的是高版本JDK,需要手动引入JAXB相关依赖才能正常使用。