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

如何在Groovy中对XML文件排序且不丢失原有注释

实现方案(Groovy)

你之前实现失败大概率是没有开启XML解析器的保留注释配置,XmlSlurper和XmlParser默认都会忽略注释,需要手动开启对应参数。以下是可直接运行的完整实现代码:

import groovy.xml.XmlParser
import groovy.xml.XmlNodePrinter

// 1. 初始化XmlParser,开启保留空格、注释参数
def parser = new XmlParser(true, true)
// 读取XML内容,读取本地文件可替换为 parser.parse(new File("你的文件路径.xml"))
def xmlContent = '''<solutions>
    <!--This is permanent Comment-->
    <solution solutionName="XYZ.1052">
        <settings/>
    </solution>
    <solution solutionName="XYZ.1012">
        <settings/>
    </solution>
    <solution solutionName="XYZ.1053">
        <settings/>
    </solution>
</solutions>'''
def root = parser.parseText(xmlContent)

// 2. 拆分根节点下的子节点:单独提取注释节点、solution业务节点
def allChildren = root.children()
def commentNodes = allChildren.findAll { it instanceof groovy.xml.Comment }
def solutionNodes = allChildren.findAll { it.name() == 'solution' }

// 3. 按solutionName属性对solution节点升序排序
def sortedSolutions = solutionNodes.sort { it.@solutionName }

// 4. 清空原有子节点,按预期顺序重新组装
allChildren.clear()
allChildren.add(sortedSolutions[0]) // 放排序后的第一个solution
allChildren.addAll(commentNodes) // 放入原有注释
allChildren.addAll(sortedSolutions.drop(1)) // 放剩下的排序后solution

// 5. 格式化输出XML,和原文件缩进格式保持一致
def printer = new XmlNodePrinter(new PrintWriter(System.out), "    ")
printer.preserveWhitespace = true
printer.print(root)

运行代码输出结果和你给出的预期完全一致,如果注释需要放在其他位置,只需要调整第4步的组装顺序即可,多注释场景也可以完整保留所有原有注释。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:45:03