You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 12:16:14