如何解决Gradle Groovy中XmlUtil.serialize转义XML属性特殊字符问题
解决方案
问题原因
Gradle内置的XmlUtil.serialize和XmlNodePrinter均遵循标准XML语法规范,默认会对属性值中的>、<、&、"等特殊字符做自动转义,你遇到的>被转换为>是默认的合规处理逻辑,若要保留原始字符需要自定义序列化逻辑。
方案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) // 可根据你的实际需求添加更多替换规则,比如替换<为<等 serializedContent = serializedContent.replaceAll('>', '>') // 写回文件 file("替换为你的XML文件实际路径").text = serializedContent } }
注意事项
- 关闭特殊字符转义后生成的XML不符合标准XML规范,仅当你的下游使用场景可以兼容非标准XML时再采用上述方案。
- 字符串替换方案需要严格匹配替换规则,避免误替换内容中原本需要保留的转义字符。
内容的提问来源于stack exchange,提问作者Pieter
相关产品推荐
相关产品推荐

