FreeMarker模板怎么生成XML FTL语法

来源:站长论坛作者:落伍者头衔:草根站长
导读:本期聚焦于小伙伴创作的《FreeMarker模板怎么生成XML FTL语法》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《FreeMarker模板怎么生成XML FTL语法》有用,将其分享出去将是对创作者最好的鼓励。

FreeMarker作为轻量级的模板引擎,常被用于根据数据动态生成各类文本文件,其中生成XML文件是常见需求之一。要实现这一功能,需要同时掌握FreeMarker的FTL语法规则和XML的书写规范,避免生成的内容出现格式错误。

FreeMarker模板怎么生成XML FTL语法

FreeMarker生成XML的基础准备

首先需要搭建FreeMarker的运行环境,在Java项目中可以通过Maven引入依赖:

<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.32</version>
</dependency>

接着需要创建FreeMarker的配置实例,指定模板文件的加载路径,核心初始化代码如下:

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.util.HashMap;
import java.util.Map;

public class XmlGenerator {
    public static void main(String[] args) throws IOException, TemplateException {
        // 创建FreeMarker配置实例
        Configuration cfg = new Configuration(Configuration.VERSION_2_3_32);
        // 指定模板文件所在目录
        cfg.setDirectoryForTemplateLoading(new File("src/main/resources/templates"));
        // 设置字符编码
        cfg.setDefaultEncoding("UTF-8");
        // 加载FTL模板文件
        Template template = cfg.getTemplate("user.xml.ftl");
        // 准备模板数据
        Map<String, Object> data = new HashMap<>();
        data.put("userName", "张三");
        data.put("age", 25);
        data.put("hobbies", new String[]{"读书", "跑步", "编程"});
        // 生成XML文件
        FileWriter writer = new FileWriter("output/user.xml");
        template.process(data, writer);
        writer.close();
    }
}

FTL基础语法在XML生成中的应用

变量输出

在FTL模板中,使用${变量名}的格式输出数据,生成XML时需要注意XML的特殊字符转义,FreeMarker默认会对输出的内容进行HTML转义,如果需要生成XML,建议手动处理特殊字符,或者使用?xml内置函数:

<?xml version="1.0" encoding="UTF-8"?>
<user>
    <name>${userName?xml}</name>
    <age>${age}</age>
</user>

如果变量值中包含<>&等XML特殊字符,?xml函数会自动将其转义为对应的实体,避免XML格式错误。

循环语法

当XML中需要生成重复的节点时,可以使用FTL的<#list>循环语法,例如生成用户的爱好列表:

<?xml version="1.0" encoding="UTF-8"?>
<user>
    <name>${userName?xml}</name>
    <age>${age}</age>
    <hobbies>
        <#list hobbies as hobby>
        <hobby>${hobby?xml}</hobby>
        </#list>
    </hobbies>
</user>

上述代码中,<#list hobbies as hobby>会遍历hobbies数组,每次循环将当前元素赋值给hobby变量,生成对应的<hobby>节点。

条件判断语法

如果需要根据数据动态决定是否生成某个XML节点,可以使用<#if>条件判断语法,例如只有当用户年龄大于18岁时才生成成年标记:

<?xml version="1.0" encoding="UTF-8"?>
<user>
    <name>${userName?xml}</name>
    <age>${age}</age>
    <#if age > 18>
    <adult>true</adult>
    </#if>
</user>

条件判断还支持<#else>分支,满足复杂的条件逻辑需求:

<#if age > 18>
<user_type>成年用户</user_type>
<#else>
<user_type>未成年用户</user_type>
</#if>

生成复杂XML的进阶技巧

处理XML命名空间

如果生成的XML需要包含命名空间,直接在FTL模板中按照XML规范书写即可:

<?xml version="1.0" encoding="UTF-8"?>
<user xmlns="http://www.ipipp.com/user"
      xmlns:addr="http://www.ipipp.com/address">
    <name>${userName?xml}</name>
    <addr:location>北京</addr:location>
</user>

自定义函数处理数据

如果需要对数据做特殊处理再输出到XML中,可以在Java代码中自定义方法,放到模板数据中使用,例如格式化日期:

import freemarker.template.SimpleMethodModel;
import freemarker.template.TemplateMethodModelEx;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

public class DateFormatMethod implements TemplateMethodModelEx {
    @Override
    public Object exec(List arguments) {
        Date date = (Date) arguments.get(0);
        String pattern = arguments.get(1).toString();
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        return sdf.format(date);
    }
}

// 在main方法中添加数据
data.put("createTime", new Date());
data.put("formatDate", new DateFormatMethod());

对应的FTL模板中使用方式:

<create_time>${formatDate(createTime, "yyyy-MM-dd HH:mm:ss")}</create_time>

常见问题与注意事项

  • XML文件的声明<?xml version="1.0" encoding="UTF-8"?>需要放在FTL模板的第一行,前面不能有任何空白字符或者换行,否则会导致XML格式错误。
  • 生成XML时建议统一使用UTF-8编码,避免中文乱码问题,FreeMarker的配置和输出流的编码都需要保持一致。
  • 如果FTL模板中包含大量的静态XML内容,注意静态内容中的<>不需要转义,只有动态输出的变量中如果包含这些字符才需要处理。
  • 如果XML结构比较复杂,建议先写好静态的XML样例,再逐步替换为FTL的动态语法,降低出错概率。

通过以上FTL语法和注意事项,就可以使用FreeMarker模板稳定生成符合要求的XML文件,满足各类业务场景的需求。

FreeMarkerXMLFTL语法模板生成修改时间:2026-06-10 12:24:30

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。