Groovy通过XmlSlurper和MarkupBuilder提供简洁XML处理能力:XmlSlurper将XML映射为可链式访问的对象树,支持属性@、文本text()及闭包筛选;MarkupBuilder用DSL生成格式化XML,支持动态逻辑与转义控制。

Groovy 提供了非常简洁、直观的 XML 处理能力,XmlSlurper 用于解析(读取)XML,MarkupBuilder 用于生成(写入)XML。它们不依赖外部库,开箱即用,语法贴近自然语言,大幅降低 XML 操作门槛。
用 XmlSlurper 解析 XML
XmlSlurper 将 XML 映射为嵌套的 Groovy 对象树,支持链式访问、通配符和闭包过滤,无需手动遍历 DOM 或处理命名空间(默认忽略)。
- 基本解析:直接传入字符串、文件或 URL
def xml = '''
- 属性访问用
@属性名,文本内容用text(),子节点直接用点号调用 -
*.是安全的“展开操作符”,避免空指针;find{}、findAll{}支持条件筛选 - 若 XML 含命名空间,需显式声明并使用
namespace:tag形式(如atom:entry)
用 MarkupBuilder 生成 XML
MarkupBuilder 通过闭包 DSL 构建 XML 结构,方法名对应标签名,参数控制属性,闭包体定义子内容,自动缩进、转义、闭合标签。
- 基础写法:传入
Writer(如StringWriter)构造 builder
def writer = new StringWriter()
def xml = new MarkupBuilder(writer)
xml.books {
book(id: '1') {
title('Groovy in Action')
author('Dierk')
}
book(id: '2') {
title('Programming Groovy')
author('Venkat')
}
}
println writer.toString()
// 输出格式化 XML 字符串
- 标签名作为方法调用,属性用命名参数(
id: '1'),文本内容作为方法参数或闭包内字符串 - 支持动态生成:在闭包中用 for 循环、if 判断等 Groovy 逻辑
- 若需 CDATA 或特殊字符,可用
mkp.yieldUnescaped('')
常见组合场景
实际开发中常先解析再修改/筛选,最后生成新 XML。例如:提取指定作者的书,另存为精简版。
def input = new XmlSlurper().parseText(xml)
def writer = new StringWriter()
new MarkupBuilder(writer).books {
input.book.findAll{ it.author.text() == 'Dierk' }.each { book ->
book(it.@id, it.title.text())
}
}
println writer.toString() //
- 注意:
XmlSlurper解析结果是只读视图,不能直接修改后写回;需用MarkupBuilder重建 - 若需保留原始格式(如注释、处理指令),应改用
XmlParser(返回可修改的 Node 对象) - 大文件处理建议用
SAXBuilder或流式解析,避免内存溢出
小贴士与注意事项
两者都默认忽略命名空间和 DTD 声明,适合大多数内部数据交换场景。
- 解析失败时抛出
org.xml.sax.SAXParseException,建议包裹 try/catch - 生成 XML 时,中文等 Unicode 字符会自动 UTF-8 编码,无需额外设置
- 若需输出带 XML 声明(
),用mkp.xmlDeclaration(version: '1.0', encoding: 'UTF-8')开头 - 与 Java 互操作时,
XmlSlurper返回的对象可直接传给 Java 方法(底层是GPathResult)










