如何用Groovy动态添加XML节点?现有实现异常求助
XML节点添加与子节点生成问题解决
原始XML结构
<root> <item> <refitemid>10</refitemid> </item> </root>
需求目标
为<item>节点添加<additional_info>节点,并在其中生成多个<sn>子节点,最终结构如下:
<root> <item> <refitemid>10</refitemid> <additional_info> <sn><id>1</id></sn> <sn><id>2</id></sn> </additional_info> </item> </root>
尝试的错误代码
def oPayload = new XmlSlurper().parseText(message.getBody() as String); //get above original XML data if (oPayload.root.item.additional_info == "" || oPayload.root.item.additional_info == null) { oPayload.root.item.appendNode { additional_info {} } } for (int i = 1; i < 3; i++) { oPayload.root.item.additional_info.appendNode { sn { id(i.text()) } } } oPayload = XmlUtil.serialize(oPayload)
问题分析
- 节点层级错误:
XmlSlurper.parseText()返回的是XML的根节点(即<root>),无需再通过oPayload.root访问,直接使用oPayload.item即可定位目标节点,多余的层级导致节点定位失败。 - 存在性判断逻辑错误:XmlSlurper解析后的节点不能直接与空字符串或
null比较,需通过节点本身的存在性判断。 - 节点赋值错误:
i是int类型,调用i.text()会抛出异常,直接传入i即可生成对应的文本内容。
正确实现代码
def originalXml = message.getBody() as String def oPayload = new XmlSlurper().parseText(originalXml) // 检查item节点下是否存在additional_info,不存在则添加 if (!oPayload.item.additional_info) { oPayload.item.appendNode { additional_info() } } // 循环生成sn节点并添加到additional_info下 for (int i = 1; i < 3; i++) { oPayload.item.additional_info.appendNode { sn { id(i) } } } // 序列化为XML字符串 def resultXml = XmlUtil.serialize(oPayload)
生成的正确XML
<root> <item> <refitemid>10</refitemid> <additional_info> <sn> <id>1</id> </sn> <sn> <id>2</id> </sn> </additional_info> </item> </root>
内容的提问来源于stack exchange,提问作者Lean Liu
相关产品推荐
相关产品推荐

