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

Groovy中如何基于字符串列表动态生成XML附件节点并添加至已有节点

解决Groovy动态生成XML附件节点的问题

嘿,刚接触Groovy就能写出这样的代码已经很棒啦!你现在的问题是要动态遍历files列表,为每个元素生成对应的<sab:attachment>节点,而不是只处理第一个。咱们来修改一下代码,让它支持动态生成:

首先看修改后的完整代码:

import groovy.xml.MarkupBuilder

class TestService {
    Node buildNode(List<String> files) {
        def builder = new MarkupBuilder()
        Node node = builder."sab:sendExternalEmail"("xmlns:sab": "http://sab/") {
            "sab:to"('client@gmail.com')
            "sab:subject"('Reply')
            "sab:body"('Body')
            "sab:from"('sender@gmail.com')
            
            // 只有当文件列表不为空时才生成attachments节点(可选,根据需求调整)
            if (!files.isEmpty()) {
                "sab:attachments"() {
                    // 遍历每个Base64文件字符串,生成对应的attachment节点
                    files.eachWithIndex { fileBase64, index ->
                        "sab:attachment"() {
                            "sab:fileName"("file${index + 1}") // 动态生成文件名,比如file1、file2...
                            "sab:fileBase64"(fileBase64)
                        }
                    }
                }
            }
        }
        return node
    }
}

关键修改点说明:

  • 遍历文件列表:用files.eachWithIndex来循环处理每个Base64字符串,eachWithIndex能同时拿到当前元素和它的索引,方便我们生成动态的文件名(比如file1、file2)。如果你的文件名不是自动生成的,而是有单独的文件名列表,只需要把"file${index + 1}"换成对应的文件名即可。
  • 嵌套生成节点:把循环放在<sab:attachments>的闭包内部,这样每个循环生成的<sab:attachment>都会自动成为<sab:attachments>的子节点,完美符合XML结构要求。
  • 空列表处理(可选):加了if (!files.isEmpty())判断,这样当没有附件时,不会生成空的<sab:attachments>节点,如果你需要保留空节点,直接去掉这个判断就行。
  • 修正构建器引用:你原来写的XML.builder()可能是笔误,Groovy标准的XML构建工具是MarkupBuilder,所以这里改成了实例化这个类(如果你的项目里有自定义的XML.builder()方法,直接改回原来的写法就行,核心逻辑不变)。

这样修改后,不管files列表有多少个元素,都会生成对应数量的附件节点啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 14:57:49