在Java生态中处理XML通常需要编写大量样板代码,而Groovy的XmlSlurper工具提供了更简洁的API,能够快速完成XML解析和映射工作,大幅降低开发成本。

XmlSlurper基础介绍
XmlSlurper是Groovy内置的XML解析工具,采用SAX流式解析模式,不需要把整个XML文档加载到内存中,因此处理大文件时性能优势明显。它的核心特点是解析结果可以直接通过GPath表达式访问,语法非常灵活。
使用XmlSlurper解析XML的基本步骤如下:
- 创建XmlSlurper实例
- 调用parse方法解析XML内容,得到GPathResult对象
- 通过GPath表达式访问XML节点和属性
XML到普通对象的映射
最常见的XML映射场景是把XML数据转换为自定义的Groovy类实例,下面通过一个用户信息的例子说明实现方式。
假设我们有如下XML内容:
<user>
<id>1001</id>
<name>张三</name>
<age>28</age>
<email>test@ipipp.com</email>
</user>
首先定义对应的用户类:
class User {
Integer id
String name
Integer age
String email
}
然后使用XmlSlurper解析并完成映射:
import groovy.util.XmlSlurper
// 解析XML字符串
def xmlText = '''<user>
<id>1001</id>
<name>张三</name>
<age>28</age>
<email>test@ipipp.com</email>
</user>'''
def slurper = new XmlSlurper()
def result = slurper.parseText(xmlText)
// 映射为User对象
def user = new User()
user.id = result.id.text() as Integer
user.name = result.name.text()
user.age = result.age.text() as Integer
user.email = result.email.text()
println user.name // 输出 张三
println user.age // 输出 28
XML到集合的映射
如果XML包含多个同类型节点,比如用户列表,我们可以把数据映射为对象集合,处理起来更方便。
示例XML内容如下:
<users>
<user>
<id>1001</id>
<name>张三</name>
<age>28</age>
</user>
<user>
<id>1002</id>
<name>李四</name>
<age>32</age>
</user>
</users>
映射为User对象列表的代码:
import groovy.util.XmlSlurper
def xmlText = '''<users>
<user>
<id>1001</id>
<name>张三</name>
<age>28</age>
</user>
<user>
<id>1002</id>
<name>李四</name>
<age>32</age>
</user>
</users>'''
def slurper = new XmlSlurper()
def result = slurper.parseText(xmlText)
// 映射为User列表
def userList = result.user.collect { node ->
new User(
id: node.id.text() as Integer,
name: node.name.text(),
age: node.age.text() as Integer
)
}
userList.each { user ->
println "用户ID:${user.id},姓名:${user.name}"
}
处理XML属性映射
很多XML节点会携带属性,XmlSlurper也支持直接访问属性值,实现属性和节点内容的共同映射。
示例XML包含属性和子节点:
<product id="2001" category="电子">
<name>无线耳机</name>
<price>399</price>
</product>
定义对应的Product类并完成映射:
import groovy.util.XmlSlurper
class Product {
String id
String category
String name
BigDecimal price
}
def xmlText = '''<product id="2001" category="电子">
<name>无线耳机</name>
<price>399</price>
</product>'''
def slurper = new XmlSlurper()
def result = slurper.parseText(xmlText)
def product = new Product()
product.id = result.@id.text() // 访问节点属性
product.category = result.@category.text()
product.name = result.name.text()
product.price = result.price.text() as BigDecimal
println "商品名称:${product.name},价格:${product.price}"
注意事项
使用XmlSlurper做XML映射时需要注意几个问题:
- XmlSlurper返回的是懒加载的GPathResult对象,解析完成后如果需要多次使用解析结果,建议先转换为具体对象,避免重复解析
- 访问节点时如果节点不存在,text()方法会返回空字符串,需要做空值判断避免类型转换异常
- 如果需要严格的XML校验,XmlSlurper默认不会校验XML格式,需要校验的话可以开启对应的解析选项
XmlSlurper的语法简洁,结合Groovy的闭包和集合操作,能够非常高效地完成各类XML映射需求,适合在Groovy项目中处理XML数据场景使用。
GroovyXmlSlurperXML映射XML解析修改时间:2026-06-19 10:21:31