登录
首页 >  文章 >  java教程

如何正确处理 XML 字符串中多重转义的实体(如 <)

时间:2026-05-05 16:12:55 147浏览 收藏

最近发现不少小伙伴都对文章很感兴趣,所以今天继续给大家介绍文章相关的知识,本文《如何正确处理 XML 字符串中多重转义的实体(如 主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~

如何正确处理 XML 字符串中多重转义的实体(如 <)

使用 StringEscapeUtils.unescapeXml() 无法一次性还原多重转义的 XML 实体(例如 &lt; → <),需循环调用直至无变化;本文详解原理、安全实现方式及最佳实践。

使用 `StringEscapeUtils.unescapeXml()` 无法一次性还原多重转义的 XML 实体(例如 `<` → `

在实际 XML 或 HTML 内容解析场景中,字符串可能因多次序列化/转义而嵌套多层实体编码。典型案例如 "&lt;errors&gt;":

  • 第一层 & 是 & 的 XML 实体,
  • < 是 < 的实体,
    但整个字符串被双重转义——即原始 先被转为 <errors>,再将其中的 & 自身也被转义为 &,最终得到 &lt;errors&gt;。

此时,StringEscapeUtils.unescapeXml() 仅执行单次解码,将 &lt; → <,输出 <errors>,而非期望的 。这是因为该方法设计上不递归处理,也不检测解码后是否仍含未解析实体。

✅ 正确做法是迭代解码,直到结果稳定(即连续两次解码结果相同):

import org.apache.commons.lang3.StringEscapeUtils;

public class XmlUnescapeDemo {
    public static String unescapeXmlFully(String input) {
        if (input == null) return null;
        String result = input;
        String previous;
        do {
            previous = result;
            result = StringEscapeUtils.unescapeXml(result);
        } while (!result.equals(previous)); // 防止无限循环,确保收敛
        return result;
    }

    public static void main(String[] args) {
        String input = "&amp;lt;errors&amp;gt;";
        String output = unescapeXmlFully(input);
        System.out.println(output); // 输出: <errors>
    }
}

⚠️ 注意事项:

  • 避免无限循环:务必用 while (!result.equals(previous)) 判断终止条件,防止因非法输入(如 &amp;lt;)导致死循环;
  • 性能考量:绝大多数真实场景最多需 2–3 次解码,无需过度优化;若批量处理高频调用,可预估最大嵌套深度(如 Math.min(5, depth))设上限;
  • 安全边界:该方法仅适用于可信来源或已校验的 XML 片段;切勿对未经清洗的用户输入直接递归解码并执行(如拼入 DOM 或反射调用),以防绕过 XSS 过滤;
  • 版本兼容性:commons-lang3 ≥ 3.4 均支持此模式,但推荐升级至 3.12.0+ 以获得更严格的实体校验与 CVE 修复。

? 总结:XML 实体解码本质是“逆向序列化”,而多重转义意味着多层序列化。unescapeXml() 是原子操作,开发者需主动承担“解包”责任。采用收敛式迭代策略,兼顾正确性、健壮性与可维护性,是处理此类问题的标准实践。

今天关于《如何正确处理 XML 字符串中多重转义的实体(如

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>