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

Grails中无法修改XML节点值的技术求助

问题描述

使用Grails 2.5.6 + OpenJDK 1.8.0_292,从TFTP服务器下载XML文件后修改节点值,代码无报错但修改未生效:打印当前IP为192.168.1.10,但生成的ammended_file.xml中IpAddress节点仍为原值。

原代码:

def xmlFile = simpleSftpService.downloadFile('tftp_file.xml')

def DeviceSettings = new XmlSlurper().parse(xmlFile)
println "Current IP Address = " + DeviceSettings.Network.IpAddress.text()

DeviceSettings.Network.IpAddress.value = "192.168.1.20"

def writer = new FileWriter('ammended_file.xml')
    def builder = new StreamingMarkupBuilder()
    writer << builder.bind {
        mkp.yield DeviceSettings
    }

XML结构:

<DeviceSettings>
    <Network>
        <IpAddress>192.168.1.10</IpAddress>
    </Network>
</DeviceSettings>
解决方法

核心问题

XmlSlurper解析得到的GPathResult对象不能通过.value =直接赋值,需要调用replaceBody()方法替换节点内容。

修改后的完整代码

def xmlFile = simpleSftpService.downloadFile('tftp_file.xml')

// 变量名遵循驼峰命名规范
def deviceSettings = new XmlSlurper().parse(xmlFile)
println "Current IP Address = " + deviceSettings.Network.IpAddress.text()

// 使用replaceBody替换节点内容
deviceSettings.Network.IpAddress.replaceBody("192.168.1.20")

// 用withWriter自动管理文件流,避免手动关闭的遗漏
new File('ammended_file.xml').withWriter('UTF-8') { writer ->
    def builder = new StreamingMarkupBuilder()
    builder.encoding = "UTF-8" // 指定编码防止乱码
    writer << builder.bind {
        mkp.yield deviceSettings
    }
}

额外优化点

  1. 变量名采用驼峰命名(deviceSettings而非DeviceSettings),符合Groovy编码规范
  2. 使用withWriter语法自动关闭文件流,避免资源泄漏
  3. 给StreamingMarkupBuilder指定编码,防止特殊字符或中文乱码

内容的提问来源于stack exchange,提问作者Simon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 11:37:31