Jackson XML模块是Jackson生态中专门用于处理XML格式数据的扩展组件,它复用了Jackson核心的序列化反序列化机制,让开发者可以用和JSON处理类似的API完成XML的相关操作,无需额外学习复杂的XML解析API。

引入Jackson XML模块依赖
首先需要在项目中添加Jackson XML模块的依赖,如果是Maven项目,在pom.xml中添加如下配置:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.15.2</version>
</dependency>
该依赖会自动引入Jackson核心组件,无需单独添加jackson-core、jackson-databind的依赖。
核心类介绍
Jackson XML模块处理XML主要用到两个核心类:
- XmlMapper:是ObjectMapper的子类,专门用于处理XML格式的数据,提供了XML和Java对象互相转换的方法。
- JacksonXmlModule:用于配置XML模块的相关特性,比如自定义序列化、反序列化规则等。
XML转Java对象
假设我们有如下结构的XML数据,需要转换为对应的Java对象:
<user>
<id>1001</id>
<name>张三</name>
<age>25</age>
<email>zhangsan@ipipp.com</email>
</user>
定义对应的Java实体类
实体类需要使用Jackson提供的注解来映射XML的节点结构:
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
// 指定XML根节点名称
@JacksonXmlRootElement(localName = "user")
public class User {
// 映射XML子节点id
@JacksonXmlProperty(localName = "id")
private Integer id;
@JacksonXmlProperty(localName = "name")
private String name;
@JacksonXmlProperty(localName = "age")
private Integer age;
@JacksonXmlProperty(localName = "email")
private String email;
// 省略getter和setter方法
}
执行XML转对象操作
使用XmlMapper的readValue方法即可完成转换:
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import java.io.File;
import java.io.IOException;
public class XmlToObjectDemo {
public static void main(String[] args) throws IOException {
XmlMapper xmlMapper = new XmlMapper();
// 从XML文件转换
User user = xmlMapper.readValue(new File("user.xml"), User.class);
System.out.println("用户ID:" + user.getId());
System.out.println("用户姓名:" + user.getName());
}
}
Java对象转XML
同样使用XmlMapper的writeValue方法可以将Java对象转换为XML格式:
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import java.io.File;
import java.io.IOException;
public class ObjectToXmlDemo {
public static void main(String[] args) throws IOException {
XmlMapper xmlMapper = new XmlMapper();
User user = new User();
user.setId(1002);
user.setName("李四");
user.setAge(28);
user.setEmail("lisi@ipipp.com");
// 将对象转换为XML并输出到文件
xmlMapper.writeValue(new File("output.xml"), user);
// 也可以直接转换为字符串
String xmlStr = xmlMapper.writeValueAsString(user);
System.out.println("生成的XML字符串:" + xmlStr);
}
}
处理XML属性
如果XML节点包含属性,比如下面的XML:
<user id="1003" type="vip">
<name>王五</name>
<age>30</age>
</user>
可以使用@JacksonXmlProperty注解的isAttribute属性来映射属性:
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
@JacksonXmlRootElement(localName = "user")
public class VipUser {
// 映射XML根节点的id属性
@JacksonXmlProperty(localName = "id", isAttribute = true)
private Integer id;
// 映射XML根节点的type属性
@JacksonXmlProperty(localName = "type", isAttribute = true)
private String type;
@JacksonXmlProperty(localName = "name")
private String name;
@JacksonXmlProperty(localName = "age")
private Integer age;
// 省略getter和setter方法
}
处理列表类型的XML节点
如果XML中存在多个同名的子节点,比如下面的订单列表:
<orderList>
<order>
<orderId>001</orderId>
<amount>199.9</amount>
</order>
<order>
<orderId>002</orderId>
<amount>299.9</amount>
</order>
</orderList>
可以使用@JacksonXmlElementWrapper注解指定列表的包装节点:
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import java.util.List;
@JacksonXmlRootElement(localName = "orderList")
public class OrderList {
// 指定包装节点名称为orderList,内部子节点名称为order
@JacksonXmlElementWrapper(localName = "orderList")
@JacksonXmlProperty(localName = "order")
private List<Order> orders;
// 省略getter和setter方法
}
class Order {
@JacksonXmlProperty(localName = "orderId")
private String orderId;
@JacksonXmlProperty(localName = "amount")
private Double amount;
// 省略getter和setter方法
}
常见配置说明
可以通过XmlMapper设置一些常用特性来满足不同需求:
| 配置方法 | 作用 |
|---|---|
| xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) | 忽略XML中存在但Java对象中没有的节点,避免反序列化报错 |
| xmlMapper.configure(SerializationFeature.INDENT_OUTPUT, true) | 生成的XML自动缩进,提升可读性 |
| xmlMapper.setDefaultUseWrapper(false) | 默认不生成列表的包装节点,适合简单列表场景 |
注意:Jackson XML模块在处理复杂XML命名空间、CDATA段等场景时可能需要额外的配置,建议根据实际需求参考官方文档调整相关参数。
Jackson_XML模块JavaXML解析XML生成修改时间:2026-06-25 00:42:52