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

Groovy MarkupBuilder如何实现动态节点名称生成目标XML

解决Groovy MarkupBuilder动态生成XML节点名称的问题

核心思路

要实现动态节点名称,关键是从原节点名中提取国家代码后的后缀,拼接成新的节点名,再利用Groovy的动态方法调用特性,让MarkupBuilder生成对应名称的节点。

比如原节点DEUcountry,去掉前3位国家代码后得到country,拼接为localcountry;DEUgenericString1则变为localgenericString1。

修改后的代码

def writer = new StringWriter()
def builder = new MarkupBuilder(writer)

builder.root{
    _root.row.each{ _row ->
        row{
            // 补充需求中的出生日期<D>节点(可根据业务逻辑动态赋值)
            D(_row.first().name() == 'Max' ? '2000-01-01' : '2001-12-31')
            
            _row.childNodes().each{ _node ->
                def nodeName = _node.name()
                def nodeText = _node.text().trim()
                if (nodeText.isEmpty()) return
                
                // 判断是否为带大写国家前缀的节点
                if (nodeName.length() >=3 && nodeName.substring(0,3) == nodeName.substring(0,3).toUpperCase()){
                    def countryCode = nodeName.substring(0,3)
                    // 生成新节点名:local + 原节点名去掉前3位的部分
                    def newNodeName = "local${nodeName.substring(3)}"
                    // 动态调用方法生成对应节点
                    "$newNodeName"([country: countryCode], nodeText)
                } else {
                    // 非国家前缀节点转为<D>节点
                    D(nodeText)
                }
            }
        }
    }
}

return writer.toString()

关键说明

  1. 动态节点生成:通过"$newNodeName"([country: countryCode], nodeText)实现,Groovy支持直接用字符串作为方法名调用,自动生成对应名称的XML节点。
  2. 空节点过滤:先对节点文本做trim处理并判断是否为空,避免生成无意义的空节点。
  3. 出生日期适配:根据示例需求补充了动态出生日期节点,可根据实际业务逻辑调整赋值规则。

内容的提问来源于stack exchange,提问作者Sebi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 18:36:25