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
相关产品推荐
相关产品推荐

