Springboot使用Freemark模板生成XML数据
前言
FreeMarker 是一款模板引擎,即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 其主要是将视图从业务逻辑中抽离处理,业务中不再包括视图的展示,而是将视图交给 FreeMarker 来输出,我们在此业务中就使用了生成xml文件的特性。
实战代码
1、导入依赖
<dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.29</version></dependency>
2、工具类
package com.sansint.system.cityCenter;import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Map;public class FreeMarkerUtil {private static FreeMarkerUtil instance;private Configuration config;public static FreeMarkerUtil getInstance() {if (instance == null) {instance = new FreeMarkerUtil();}return instance;}private FreeMarkerUtil() {this.configInstance();}private void configInstance() {if (this.config == null) {this.config = new Configuration(Configuration.getVersion());this.config.setClassLoaderForTemplateLoading(FreeMarkerUtil.class.getClassLoader(), "/template");}}/*** 根据模板,写入相关的信息数据* @param templateName* @param param* @return*/public String geneStr(String templateName, Map<String, Object> param) {StringWriter out = new StringWriter();Template tmp;try {this.config.setClassForTemplateLoading(this.getClass(), "/template");tmp = this.config.getTemplate(templateName, "UTF-8");tmp.process(param, out);out.flush();} catch (IOException e) {e.printStackTrace();} catch (TemplateException e) {e.printStackTrace();}finally {if(out!=null){try {out.close();} catch (IOException e) {e.printStackTrace();}}}return out.getBuffer().toString();}
}
3、在resource下创建template包和ftl的模版文件,如:
<?xml version="1.0" encoding="utf-8"?>
<root><common><building_id>${building_id}</building_id></common><data><meter pointcode="${pointcode}" energycode="${energycode}" time="${time}"><orgValue>${orgValue}</orgValue></meter></data>
</root>
4、调用
// 构建要替换的值
Map<String, Object> values = new HashMap<>();
values.put("building_id", getResult);
values.put("pointcode", bankDateEnergyList.get(0).getBranchCode());
values.put("energycode", "01A1A");
values.put("time", DateTimeUtil.format(dateTime, "yyyyMMddHH")+"0000");
values.put("orgValue", bankDateEnergyList.get(0).getEnergy());
// 生成替换后的 XML 字符串
String energyXml = FreeMarkerUtil.getInstance().geneStr("xianEnergy.ftl", values);
5、生成XML结果
<?xml version="1.0" encoding="utf-8"?>
<root><common><building_id>1231231</building_id></common><data><meter pointcode="1231231" energycode="01A1A" time="20250916140000"><orgValue>12312312</orgValue></meter></data>
</root>