JAXB 转换 XML
https://www.cnblogs.com/wuyongyin/p/14317489.html
简介
JAXB(Java Architecture for XML Binding)是一个业界的标凖和数据绑定技术,通过使用 JAXB,可以将 XML 文档和 Java 对象之间进行映射,使得 XML 文档可以方便的转换成 Java 对象,也可以将 Java 对象转换成 XML 文档。
JAXB 为 XML Schema 和 Java 语言之间提供了一个简单的映射关系。它允许 Java 开发人员在 JavaBean 类中定义一个映射关系,然后使用 JAXB 映射工具将 JavaBean 对象转换成 XML 文件。可以基于注解或者 XML 配置文件来完成映射关系的定义。
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<scope>runtime</scope>
</dependency>
JAXB 相关类与接口
JAXBContext
JAXBContext
类提供了将 Java 对象序列化为 XML 和 XML 反序列化为 Java 对象的方法。JAXBContext
类的实例是线程安全的,因此可以在多线程环境中共享。
JAXBContext
类的常用方法如下:
createMarshaller()
:创建一个Marshaller
对象,用于将 Java 对象序列化为 XML。createUnmarshaller()
:创建一个Unmarshaller
对象,用于将 XML 反序列化为 Java 对象。createValidator()
:创建一个Validator
对象,用于验证 XML 内容。
Marshaller
Marshaller
类用于将 Java 对象序列化为 XML 数据。Marshaller
类的常用方法如下:
marshal(Object jaxbElement, Result result)
:将 Java 对象序列化为 XML 数据,并将结果输出到指定的Result
对象中。marshal(Object jaxbElement, OutputStream os)
:将 Java 对象序列化为 XML 数据,并将结果输出到指定的输出流中。marshal(Object jaxbElement, Writer writer)
:将 Java 对象序列化为 XML 数据,并将结果输出到指定的字符输出流中。
Unmarshaller
Unmarshaller
类用于将 XML 数据反序列化为 Java 对象。Unmarshaller 类的常用方法如下:
unmarshal(Source source)
:将 XML 数据反序列化为 Java 对象。unmarshal(InputStream is)
:将 XML 数据反序列化为 Java 对象。unmarshal(Reader reader)
:将 XML 数据反序列化为 Java 对象。
Validator
Validator
类用于验证 XML 内容。Validator 类的常用方法如下:
validate(Source source)
:验证 XML 内容。validate(InputStream is)
:验证 XML 内容。validate(Reader reader)
:验证 XML 内容。
JAXB 注解
JAXB 提供了一些注解,用于在 Java 类和 XML 文件之间建立映射关系。常用的 JAXB 注解如下:
@XmlRootElement
:类级别注解,指定 Java 类映射到 XML 文件中的根元素。参数如下:
name
:指定 XML 文件中的根元素的名称。默认使用类名作为根元素的名称。namespace
:指定 XML 文件的命名空间。
@XmlElement
:字段、方法、参数级别注解,该注解可以将被注解的(非静态)字段,或者 get/set
方法对应的字段映射到 XML 文件中的元素。参数如下:
name
:指定 XML 文件中的元素的名称。默认使用小写属性名作为元素的名称。namespace
:指定 XML 文件的命名空间。required
:指定元素是否必须出现。默认值是false
。nillable
:指定元素是否可以为null
。默认值是false
。type
:指定该字段或属性的关联类型。
@XmlType
:类级别注解,指定 Java 类映射到 XML Schema 中的类型。参数如下:
name
:指定 XML Schema 中的类型的名称。默认使用类名作为类型的名称。namespace
:指定 XML Schema 的命名空间。propOrder
:指定 XML 元素的访问顺序。factoryClass
:指定工厂类。factoryMethod
:指定工厂方法。
@XmlAttribute
:字段、方法级别的注解。该注解会将字段或者 get/set
方法对应的字段映射到 XML 文件中的属性。参数如下:
name
:指定 XML 文件中的属性的名称。默认使用属性名作为属性的名称。namespace
:指定 XML 文件的命名空间。required
:指定属性是否必须出现。默认值是false
。nillable
:指定属性是否可以为null
。默认值是false
。
@XmlAccessorType
:指定映射到 XML 元素的访问类型。默认值是 XmlAccessType.PUBLIC_MEMBER
。参数如下:
XmlAccessType.FIELD
:将 Java 类的所有字段映射到 XML 元素。XmlAccessType.PROPERTY
:将 Java 类的get/set
方法映射到 XML 元素。XmlAccessType.PUBLIC_MEMBER
:将 Java 类的所有公共字段和get/set
方法映射到 XML 元素。XmlAccessType.NONE
:不映射任何字段或方法。
@XmlAccessorOrder
:指定映射到 XML 元素的访问顺序。
@XmlEnum
:枚举类级别注解,指定枚举类映射到 XML Schema 中的类型。
@XmlSchema
:包级别注解,指定包中的所有类映射到 XML Schema 中的命名空间。
@XmlSchema(namespace = "http://www.example.com/employee", elementFormDefault = XmlNsForm.QUALIFIED)
package com.example.demo.entity;
import jakarta.xml.bind.annotation.XmlNsForm;
import jakarta.xml.bind.annotation.XmlSchema;
JAXB 示例
@Data
@XmlRootElement(name = "book")
@XmlAccessorType(XmlAccessType.FIELD)
public class Book {
private String title;
private String author;
private double price;
}
<?xml version="1.0" encoding="UTF-8"?>
<book>
<title>Java 编程思想</title>
<author>埃克尔</author>
<price>108.0</price>
</book>
// 创建 JAXBContext 对象
JAXBContext context = JAXBContext.newInstance(Book.class);
// 创建 Marshaller 对象
Marshaller marshaller = context.createMarshaller();
// 创建 Book 对象
Book book = new Book();
book.setTitle("Java 编程思想");
book.setAuthor("埃克尔");
book.setPrice(108.0);
// 将 Java 对象序列化为 XML
StringWriter writer = new StringWriter();
marshaller.marshal(book, writer);
System.out.println(writer.toString());
// 创建 Unmarshaller 对象
Unmarshaller unmarshaller = context.createUnmarshaller();
// 将 XML 反序列化为 Java 对象
Book book2 = (Book) unmarshaller.unmarshal(new StringReader(writer.toString()));
System.out.println(book2.getTitle());
System.out.println(book2.getAuthor());
System.out.println(book2.getPrice());
最后更新于
这有帮助吗?