FreeMarker生成XML需禁用HTML转义,推荐在模板顶部声明output_format="XML",变量输出用${user.name?xml}或${user.name!}确保XML字符安全转义。
默认情况下,FreeMarker会对输出内容做HTML转义(比如 变成 zuojiankuohaophpcn),这会让生成的XML直接失效。必须显式禁用转义,否则得到的不是合法XML,而是被“污染”的文本。
全局包裹不推荐——它只对字符串生效,且容易漏掉嵌套结构,强制整个模板按XML格式渲染
! 或 ?xml 显式处理特殊字符即使设了 output_format="XML",FreeMarker仍不会自动转义变量值里的 、&、" 等——这些必须手动处理,否则XML解析失败。
${user.name?xml} —— 安全转义所有XML敏感字符${user.name!}(前提是全局 output_format="XML" 已生效)${user.name},哪怕值看起来“干净”,只要含 & 或 就会破坏XML结构
FreeMarker本身不校验XML语法,但生成结果必须符合规范,否则下游系统(如SOAP服务、配置加载器)会拒收。
,不能靠变量拼接导致引号错位:
而非 ,后者在严格XML解析器里可能被当成有子节点<#ftl output_format="XML" encoding="UTF-8">XML生成真正难的不是语法,而是**信任${book.title?xml} ${book.author?xml}

、BOM头、或混合了UTF-8和Latin-1的字段。别依赖“看起来没问题”,每个变量输出都要过 ?xml。