如何仅反转义XML标签保留内容转义,处理CDATA内的XML数据
XML CDATA转义内容格式化解决方案
核心问题说明
你遇到的问题本质是返回的XML标签被做了二次转义,但内容里的小于号转义符需要保留,不能全量解XML转义。
- 直接调用
StringEscapeUtils.unescapeXml()不符合需求的原因:该方法会将所有XML转义字符统一解转义,包括内容中需要保留的&lt;(对应小于号<),会导致最终的XML标签结构混乱,无法正常解析。 - 你之前写的正则错误原因:Java的
replaceAll方法中,捕获组的引用用$1、$2这种格式,不支持{0}占位符语法。
正确解决方案
通过正则匹配仅对XML标签部分的转义符做解转义,保留内容中的转义符即可,代码示例如下:
// 填入接口返回的原始字符串 String rawContent = "你的原始返回内容"; // 第一步:替换标签开头的&lt;为< String step1 = rawContent.replaceAll("&lt;(/?[a-zA-Z][\\w-]*)", "<$1"); // 第二步:替换标签结尾的&gt;为> String formattedXml = step1.replaceAll("([a-zA-Z][\\w-]*)&gt;", "$1>"); // formattedXml就是符合要求的可解析XML
如果你的XML标签名包含字母、数字、下划线、横杠之外的特殊字符,调整正则中的[a-zA-Z][\\w-]*匹配规则适配实际场景即可。
内容的提问来源于stack exchange,提问作者David González Arias
相关产品推荐
相关产品推荐

