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

如何使用Groovy动态添加含可变嵌套标签的XML新节点

Groovy动态生成XML嵌套标签解决方案

需求说明

现有基础XML结构:

<A>
  <B>Test@yopmail.com</B>           
</A>

需要动态插入<C>标签,每个<C>下的<Info>标签数量(1-100个不等)、name属性及标签值均为运行时确定,最终生成类似以下两种结构的XML:

示例1

<A>
    <B>Test@yopmail.com</B>
    <C>
      <Info name="Name">Jane</Info>
      <Info name="Age">1</Info>
    </C>
    <C>
      <Info name="Name">Kate</Info>
      <Info name="Age">100</Info>
    </C>
</A>

示例2

<A>
    <B>Test@yopmail.com</B>
    <C>
      <Info name="Name">Hello</Info>
      <Info name="Age">100</Info>
      <Info name="Country">Test</Info>
    </C>
    <C>
      <Info name="Name">Hello world</Info>
      <Info name="Age">200</Info>
      <Info name="Country">USA</Info>
    </C>
</A>

问题现状

使用appendNode静态写法无法适配运行时动态变化的<Info>标签,需要实现动态映射逻辑。

解决方案

核心思路是将运行时获取的参数整理为结构化数据(外层为<C>标签集合,内层为每个<C>下的<Info>属性与值集合),通过Groovy闭包内的循环逻辑动态生成节点。

完整代码示例

import groovy.xml.XmlSlurper
import groovy.xml.XmlUtil

// 基础XML字符串
def xmlAsString = """
<A>
  <B>Test@yopmail.com</B>           
</A>
"""

// 解析XML
def root = new XmlSlurper(false, false).parseText(xmlAsString)

// 模拟运行时获取的动态数据:外层是每个C标签对应的Info列表,内层是Info的name和value
def dynamicCData = [
    // 第一个C标签下的Info集合
    [
        [name: "Name", value: "Jane"],
        [name: "Age", value: "1"]
    ],
    // 第二个C标签下的Info集合
    [
        [name: "Name", value: "Kate"],
        [name: "Age", value: "100"]
    ]
]

// 遍历动态数据,生成C标签及嵌套的Info标签
dynamicCData.each { infoList ->
    root.appendNode {
        C {
            // 遍历当前C下的所有Info参数,动态生成节点
            infoList.each { info ->
                Info(name: info.name, info.value)
            }
        }
    }
}

// 序列化并输出结果
def finalXml = XmlUtil.serialize(root)
println finalXml

适配不同场景

如果需要生成示例2的结构,只需修改dynamicCData的内容即可:

def dynamicCData = [
    [
        [name: "Name", value: "Hello"],
        [name: "Age", value: "100"],
        [name: "Country", value: "Test"]
    ],
    [
        [name: "Name", value: "Hello world"],
        [name: "Age", value: "200"],
        [name: "Country", value: "USA"]
    ]
]

关键说明

  • Groovy的闭包支持在节点构造逻辑中执行循环、条件判断等动态代码,完美适配运行时参数的变化
  • 只需将运行时获取的<Info>参数转换为List<List<Map>>格式(外层List对应<C>标签集合,内层List对应单个<C>下的<Info>集合,Map存储name属性和标签值),即可实现任意数量的动态标签生成

内容的提问来源于stack exchange,提问作者jdk1.7

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 08:59:20