You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Smooks XML-XML转换中Freemarker模板转义字符丢失问题求解

解决Smooks+Freemarker XML转换中转义字符丢失的问题

这个问题我之前也碰到过,核心原因是XML解析器会自动解析输入中的转义实体(比如把&转成&),而如果Freemarker模板没有重新对这些字符做XML转义,输出的XML就会出现未转义的特殊字符,导致格式无效。下面是具体的解决步骤:

1. 在Freemarker模板中强制启用XML转义

Freemarker提供了两种方式确保输出内容自动转义为合法的XML字符:

方式一:全局转义(推荐)

用<#escape>指令包裹整个模板内容,这样所有变量输出都会自动应用XML转义:

<#escape x as x?xml>
<root>
  <userName>${user.name}</userName>
  <description>${user.description}</description>
</root>
</#escape>

方式二:单个变量转义

如果只需要对特定变量做转义,可以在变量后添加?xml内置函数:

<root>
  <userName>${user.name?xml}</userName>
  <description>${user.description?xml}</description>
</root>

这两种方式都会把特殊字符(比如&、<、>、"、')转义成对应的XML实体(&amp;、&lt;、&gt;、&quot;、&apos;),保证输出XML的合法性。

2. 检查Smooks配置,避免过度解析

确保Smooks在读取输入XML时,没有把节点内容处理成“原始未转义文本”之外的格式。比如如果你的Smooks配置中使用了dom或SAX解析器,默认行为就是正确解析转义实体的,这时候只需要在模板中重新转义即可。

如果输入XML中包含CDATA块,你需要确保Smooks保留CDATA的内容,然后在模板中可以选择用<![CDATA[${content}]]>包裹,但注意如果CDATA内容本身包含]]>,还是需要转义,所以结合?xml使用更稳妥:

<description><![CDATA[${user.description?xml}]]></description>

原理补充

输入XML中的&amp;是合法的实体引用,会被XML解析器转换成&字符;当你在模板中输出这个&时,如果不转义,输出的XML就会出现裸的&,这违反了XML语法规则。通过Freemarker的?xml转义,我们把&重新转成&amp;,这样输出的XML就完全合法了。

内容的提问来源于stack exchange,提问作者keanu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:14:29