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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:36:03