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

如何解决Gradle Groovy中XmlUtil.serialize转义XML属性特殊字符问题

解决方案

问题原因

Gradle内置的XmlUtil.serialize和XmlNodePrinter均遵循标准XML语法规范,默认会对属性值中的>、<、&、"等特殊字符做自动转义,你遇到的>被转换为&gt;是默认的合规处理逻辑,若要保留原始字符需要自定义序列化逻辑。

方案1:使用JDOM2自定义转义规则(推荐)

首先解决JDOM2依赖无法找到的问题,需要在build.gradle开头正确声明buildscript仓库和依赖:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'org.jdom:jdom2:2.0.6.1'
    }
}

之后即可在任务中使用JDOM2自定义转义策略,仅保留必要的转义规则:

import org.jdom2.input.SAXBuilder
import org.jdom2.output.Format
import org.jdom2.output.XMLOutputter

tasks.register('modifyXml') {
    doLast {
        def xmlFile = file("替换为你的XML文件实际路径")
        // 读取XML文件
        def saxBuilder = new SAXBuilder()
        def document = saxBuilder.build(xmlFile)
        // 此处编写你修改XML节点结构的业务逻辑
        def rootNode = document.rootElement

        // 自定义输出格式,仅转义属性值必须的双引号和&,其余字符不转义
        def outputFormat = Format.getPrettyFormat()
        outputFormat.setEscapeStrategy((ch) -> {
            return ch == '"' || ch == '&'
        })
        // 将修改后的结构写回文件
        def outputter = new XMLOutputter(outputFormat)
        outputter.output(document, new FileOutputStream(xmlFile))
    }
}

方案2:无第三方依赖的字符串替换方案

如果不想引入额外依赖,且你的XML结构简单、无复杂嵌套场景,可以对序列化后的文本做定向替换:

tasks.register('modifyXml') {
    doLast {
        // 此处为你原有修改XML节点的逻辑
        def modifiedNode = 你的修改后的XML节点对象

        // 用默认方式序列化后做定向替换
        def serializedContent = XmlUtil.serialize(modifiedNode)
        // 可根据你的实际需求添加更多替换规则,比如替换&lt;为<等
        serializedContent = serializedContent.replaceAll('&gt;', '>')
        // 写回文件
        file("替换为你的XML文件实际路径").text = serializedContent
    }
}

注意事项

  • 关闭特殊字符转义后生成的XML不符合标准XML规范,仅当你的下游使用场景可以兼容非标准XML时再采用上述方案。
  • 字符串替换方案需要严格匹配替换规则,避免误替换内容中原本需要保留的转义字符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 13:24:10