FreeMarker生成XML需严格遵循XML语法并禁用HTML转义:1.模板开头用纯文本声明;2.通过!no_esc、或配置XMLOutputFormat.INSTANCE关闭自动转义。

1. 声明 XML 版本和编码(推荐放在模板开头)
用纯文本方式输出 XML 声明,FreeMarker 不会解析它:
2. 关闭自动转义,防止 `` 被转成 ``
XML 内容中标签必须原样输出,不能被 HTML 转义。有三种常用方式:
-
在变量插值时加
!no_esc:${user.name!no_esc} -
用
...#noescape>包裹一段区域:
ail>${user.email}
#noescape>
-
配置全局默认不转义 XML 模板(推荐):在 Java 代码中设置模板的
outputFormat为XMLOutputFormat.INSTANCE,这样 `${...}` 默认就不转义(但需确保变量内容本身是合法 XML 字符,不含未转义的 `
3. 手动转义特殊字符(当变量含非法 XML 字符时)
如果变量可能含 ``, `&`, `"`, `'`,又不能依赖外部清理,可用内置函数转义:
-
${user.bio?xml}—— 对字符串做标准 XML 字符实体转义(`zuojiankuohaophpcn,`&` →&等) - 注意:
?xml只处理字符,不校验结构;它适合用于文本内容,**不能用于生成标签名或属性名**
4. 生成带命名空间、CDATA 或处理指令(可选进阶)
FreeMarker 本身不解析 XML 结构,所有 XML 构造都靠文本拼接,因此完全可控:
- 命名空间:
- CDATA:
(注意:先 ?xml 转义内容,再包 CDATA 更安全) - XML 处理指令(如 stylesheet):
或 ),建议用 避免意外空格破坏格式。









