如何在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对象,其子节点包含字符串类型的文本段和子节点对象。要保留子节点的同时修改指定文本,需定位到目标文本子节点并替换其值,具体步骤如下:
- 定位目标文本子节点:遍历
firstNode的子节点,找到第一个字符串类型的元素(即SomeText) - 替换文本内容:在子节点列表中替换该字符串为新文本
- 输出修改后的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
相关产品推荐
相关产品推荐

