StringEscapeUtils.escapeXml重复转义问题分析及解决方案
问题分析与解决方案
核心问题
你忽略了XMLStreamWriter的writeCharacters方法本身会自动处理XML特殊字符的转义。
当你手动调用StringEscapeUtils.escapeXml把ü转成ü后,再传给writeCharacters,这个方法会把字符串里的&再次转义成&,最终就得到了Begünstigter这种二次转义的结果。不管你用commons-text/lang/lang3里的哪一种escapeXml方法,本质都是生成带&的实体引用,都会被writeCharacters二次转义,所以问题不在escape方法本身,而是重复转义了。
解决方案
直接移除手动转义的步骤,把原始字符串传给writeCharacters即可:
修改代码中这一行:
writer.writeCharacters(StringEscapeUtils.escapeXml(entry.getValue().toString()));
改成:
writer.writeCharacters(entry.getValue().toString());
原理说明
XMLStreamWriter的writeCharacters方法会自动处理所有XML规范要求转义的字符(包括&、<、>、"、'),同时:
- 如果你的XML文档编码是UTF-8(绝大多数场景都是),像
ü这类Unicode字符可以直接写入,XML解析器能正确识别,不需要转成实体引用。 - 如果场景要求必须输出实体引用,XMLStreamWriter会在必要时自动转换,不会出现二次转义的问题。
额外验证
如果需要确认效果,可以测试Begünstigter的写入结果:
- 直接写入原始字符串,XML输出会是
Begünstigter(UTF-8编码下合法),或者根据XMLWriter的配置自动转成ü,但绝不会出现&#252;的错误格式。
内容的提问来源于stack exchange,提问作者Eda
相关产品推荐
相关产品推荐

