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

如何用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)

问题分析

  1. 节点层级错误:XmlSlurper.parseText()返回的是XML的根节点(即<root>),无需再通过oPayload.root访问,直接使用oPayload.item即可定位目标节点,多余的层级导致节点定位失败。
  2. 存在性判断逻辑错误:XmlSlurper解析后的节点不能直接与空字符串或null比较,需通过节点本身的存在性判断。
  3. 节点赋值错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 11:41:12