使用Freemarker打印时遭遇无效XML字符错误求助
解决Freemarker打印时的无效XML字符错误
你遇到的问题是API返回的JSON中包含\u2013(短破折号)这类字符,导致Freemarker生成XML时触发无效字符报错。以下是几种直接可行的处理方案:
方案一:用Freemarker内置指令转义XML特殊字符
如果输出是XML格式,直接对变量使用?xml内置指令,它会自动将XML不兼容的字符转换为合法实体:
${key?xml}
比如会把\u2013转成–,确保XML解析器能正常识别。
方案二:预处理JSON数据清理无效字符
在将JSON转换为Freemarker可用的数据模型前,过滤掉XML禁止的控制字符(注意\u2013本身是合法XML字符,可能是其他隐藏控制字符导致报错)。以Java后端为例:
// 匹配XML无效控制字符的正则 String invalidXmlRegex = "[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]"; Pattern pattern = Pattern.compile(invalidXmlRegex); // 清理字符串 String cleanedValue = pattern.matcher(originalValue).replaceAll("");
方案三:强制设置UTF-8编码避免字符乱码
确保Freemarker输出和XML文档都使用UTF-8编码,避免编码不匹配引发的解析错误:
- 配置Freemarker编码:
configuration.setDefaultEncoding("UTF-8"); configuration.setOutputEncoding("UTF-8");
- 在生成的XML头部声明编码:
<?xml version="1.0" encoding="UTF-8"?>
备选方案:手动替换特殊字符(谨慎使用)
如果确认\u2013是问题根源,可以直接替换为普通破折号,但会修改原文内容:
${key?replace("\u2013", "-")}
内容的提问来源于stack exchange,提问作者Ganesh Mandapati
相关产品推荐
相关产品推荐

