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()
关键说明
- 动态节点生成:通过
"$newNodeName"([country: countryCode], nodeText)实现,Groovy支持直接用字符串作为方法名调用,自动生成对应名称的XML节点。 - 空节点过滤:先对节点文本做trim处理并判断是否为空,避免生成无意义的空节点。
- 出生日期适配:根据示例需求补充了动态出生日期节点,可根据实际业务逻辑调整赋值规则。
内容的提问来源于stack exchange,提问作者Sebi
相关产品推荐
相关产品推荐

