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 } }
额外优化点
- 变量名采用驼峰命名(
deviceSettings而非DeviceSettings),符合Groovy编码规范 - 使用
withWriter语法自动关闭文件流,避免资源泄漏 - 给
StreamingMarkupBuilder指定编码,防止特殊字符或中文乱码
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

