如何使用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
相关产品推荐
相关产品推荐

