如何使用Gradle与正则表达式解析含注释的XML并保存为新文件
Groovy正则实现XML指定节点保留方案
需求说明
你需要在Groovy中通过正则而非DOM操作解析XML,完整保留文件内注释,仅保留根元素、tasks元素及其内部所有子节点和注释,删除其余全部内容,无需提前指定待删除元素。
初始文件示例
<root attribute1="attribute"> <tests> <test>Test 1</test> <test>Test 2</test> </tests> <tasks> <!-- <task name="task one" > Some task that is commented </task> --> <task name="task one" > Some text </task> </tasks> </root>
预期输出文件
<root attribute1="attribute"> <tasks> <!-- <task name="task one" > Some task that is commented </task> --> <task name="task one" > Some text </task> </tasks> </root>
原有代码问题
你当前编写的代码使用了DOMBuilder解析,不符合使用正则的要求,且DOM操作可能存在注释丢失、格式变动的问题。
正则实现代码
def extractXml() { def input = new File("initial_file.xml") if (!input.exists()) { return } def rawContent = input.text // 匹配根元素开始标签,兼容任意属性 def rootStart = (rawContent =~ /<root[^>]*>/)[0] // 匹配完整的tasks节点,包含内部所有子节点、注释,[\s\S]匹配所有字符(含换行),非贪婪匹配避免越界 def tasksBlock = (rawContent =~ /<tasks[\s\S]*?<\/tasks>/)[0] // 拼接结果,保持缩进格式 def outputContent = "${rootStart}\n ${tasksBlock}\n</root>" new File("new_file.xml").write(outputContent) }
代码说明
- 正则使用
[\s\S]匹配所有字符,等效于DOTALL模式,无需额外配置正则标记,兼容性更好 - 非贪婪匹配
*?确保只会匹配到第一个</tasks>闭合标签,即使文件内存在多个tasks节点也能正确处理 - 所有注释、原始格式、节点属性都会完整保留,不会出现DOM操作可能导致的格式变动问题
- 若实际根节点名称不是
root,只需修改第一个正则中的root为对应根节点名称即可
内容的提问来源于stack exchange,提问作者user16891224
相关产品推荐
相关产品推荐

