Groovy通过XmlSlurper和MarkupBuilder提供简洁XML处理能力:XmlSlurper将XML映射为可链式访问的对象树,支持属性@、文本text()及闭包筛选;MarkupBuilder用DSL生成格式化XML,支持动态逻辑与转义控制。
Groovy 提供了非常简洁、直观的 XML 处理能力,XmlSlurper 用于解析(读取)XML,MarkupBuilder 用于生成(写入)XML。它们不依赖外部库,开箱即用,语法贴近自然语言,大幅降低 XML 操作门槛。
XmlSlurper 将 XML 映射为嵌套的 Groovy 对象树,支持链式访问、通配符和闭包过滤,无需手动遍历 DOM 或处理命名空间(默认忽略)。
def xml = '''
@属性名,文本内容用 text(),子节点直接用点号调用*. 是安全的“展开操作符”,避免空指针;find{}、findAll{} 支持条件筛选namespace:tag 形式(如 atom:entry)MarkupBuilder 通过闭包 DSL 构建 XML 结构,方法名对应标签名,参数控制属性,闭包体定义子内容,自动缩进、转义、闭合标签。
Writer(如 StringWriter)构造 builderdef writer = new StringWriter()
def xml = new Mar
kupBuilder(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'),文本内容作为方法参数或闭包内字符串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),用 mkp.xmlDeclaration(version: '1.0', encoding: 'UTF-8') 开头XmlSlurper 返回的对象可直接传给 Java 方法(底层是 GPathResult)