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

如何在Groovy中修改含子节点的XML节点文本内容?

Groovy 修改 XmlParser 解析节点的指定文本内容

问题场景

给定如下XML结构:

String xml = """
<root>
    <firstNode class="first">SomeText<childNode class="child">SomeMoreText</childNode></firstNode>
</root>
"""

需要将firstNode下的SomeText修改为NewText,同时保留后续的childNode节点。已通过XmlParser获取到firstNode:

def firstNode = new groovy.xml.XmlParser().parseText(xml).firstNode[0]

解决方案

XmlParser解析后的Node对象,其子节点包含字符串类型的文本段和子节点对象。要保留子节点的同时修改指定文本,需定位到目标文本子节点并替换其值,具体步骤如下:

  1. 定位目标文本子节点:遍历firstNode的子节点,找到第一个字符串类型的元素(即SomeText)
  2. 替换文本内容:在子节点列表中替换该字符串为新文本
  3. 输出修改后的XML:使用XmlNodePrinter打印修改后的节点结构

完整代码示例:

String xml = """
<root>
    <firstNode class="first">SomeText<childNode class="child">SomeMoreText</childNode></firstNode>
</root>
"""

// 解析XML
def parser = new groovy.xml.XmlParser()
def rootNode = parser.parseText(xml)
def firstNode = rootNode.firstNode[0]

// 定位并替换目标文本
def children = firstNode.children()
// 找到第一个字符串类型的子节点
def targetText = children.find { it instanceof String }
if (targetText) {
    def textIndex = children.indexOf(targetText)
    children[textIndex] = "NewText"
}

// 输出修改后的XML
def writer = new StringWriter()
new groovy.xml.XmlNodePrinter(new PrintWriter(writer)).print(rootNode)
println writer.toString()

注意事项

  • 不要使用firstNode.setValue("NewText"):该方法会将firstNode的所有子节点替换为指定文本,导致childNode被删除,最终结果会丢失原有子节点。
  • 若firstNode下有多个文本段,可通过索引或更精确的匹配逻辑定位目标文本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 17:30:33