Groovy中如何用MarkupBuilder动态生成SQL结果集的XML输出
解决Groovy 4.0.18中用MarkupBuilder动态生成XML节点的问题
假设你已经通过Sql.rows()拿到了结果集rows(List<GroovyRowResult>类型)和列名列表columnNames,下面是能正常工作的实现代码:
def writer = new StringWriter() def builder = new MarkupBuilder(writer) builder.root { rows.each { row -> record { columnNames.each { col -> // 核心:用Groovy动态方法调用语法,将列名作为XML节点名 builder."$col"(row[col]) } } } } // 输出最终XML println writer.toString()
为什么之前的写法不生效?
你大概率是直接在闭包里写了col(row[col])这种代码——这种写法会把col当成固定方法名,生成的是<col>节点,而非你需要的动态列名节点。Groovy里要动态调用方法(这里就是生成对应列名的XML节点),必须用builder."$变量名"的语法,这样才能把变量的值作为方法名(即XML节点名)来执行。
额外优化:处理空值与格式调整
如果结果集中存在空值,可以添加判断避免生成空节点,或设置默认值:
columnNames.each { col -> def val = row[col] ?: "" // 将空值替换为空字符串 builder."$col"(val) }
要是需要调整XML格式(比如用双引号、自定义缩进),可以给MarkupBuilder加配置:
builder.setDoubleQuotes(true) // 让属性用双引号 builder.setIndent(" ") // 设置缩进为两个空格
示例输出
假设查询返回两行用户数据,生成的XML会是类似这样的结构:
<root> <record> <id>1</id> <name>Alice</name> <age>30</age> </record> <record> <id>2</id> <name>Bob</name> <age>25</age> </record> </root>
内容的提问来源于stack exchange,提问作者H. Dog
相关产品推荐
相关产品推荐

