如何在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
相关产品推荐
相关产品推荐

