还在拼接字符串生成XML?(Java)

news2024/11/15 4:00:11

FreeMarker是一个功能强大的Java模板引擎,广泛应用于生成动态内容,如HTML、XML和其他文本格式。本文将介绍FreeMarker的基本使用方法,并提供一个更丰富的XML模板示例,以及模板标签和标识的含义。

1. 引入依赖

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

2. 编写生成XML的方法

以下是一个实现IXMLGeneratorService接口的服务类示例,该类负责加载FreeMarker模板并生成XML文件。

@Service("InitXMLGeneratorServiceImpl")
@Slf4j
public class InitXMLGeneratorServiceImpl implements IXMLGeneratorService {
    @Value("${project.path:config.cfg}")
    private String path;

    /**
     * 模板加载方法
     *
     * @param templateContent 模板内容字符串
     * @return 加载的模板
     */
    @Override
    public Template templateBuild(String templateContent) {
        Configuration cfg = new Configuration(Configuration.VERSION_2_3_30);
        cfg.setClassForTemplateLoading(InitXMLGeneratorServiceImpl.class, "/");
        StringTemplateLoader stringTemplateLoader = new StringTemplateLoader();
        stringTemplateLoader.putTemplate("config.ftl", templateContent);
        cfg.setTemplateLoader(stringTemplateLoader);
        try {
            return cfg.getTemplate("config.ftl");
        } catch (IOException e) {
            log.error("加载配置XML模板出现异常:{}", e.getMessage());
            return null;
        }
    }

    /**
     * 生成XML
     *
     * @param template 模板对象
     * @param data 数据模型
     * @param path 文件保存路径
     * @param fileName 文件名
     * @return 生成的XML内容及文件信息
     */
    @Override
    public JSONObject createXMLAndGetAllPath(Template template, JSONObject data, String path, String fileName) {
        JSONObject jsonObject = new JSONObject();
        try {
            StringWriter writer = new StringWriter();
            template.process(data, writer);
            String xml = writer.toString();
            File file = new File(path + "/" + fileName);
            try (BufferedWriter bw = new BufferedWriter(new FileWriter(file))) {
                bw.write(xml);
                bw.flush();
                jsonObject.set("xmlContent", xml);
                jsonObject.set("file", file);
                return jsonObject;
            } catch (Exception e) {
                log.error("写出XML模板出现异常:{}", e.getMessage());
                return null;
            }
        } catch (IOException | TemplateException e) {
            log.error("生成XML模板出现异常:{}", e.getMessage());
            return null;
        }
    }
}

3. 定义更丰富的XML模板

以下是一个更丰富的XML模板示例,适用于生成配置文件:

<!-- config.ftl -->
<configuration>
    <#if itemList?has_content>
    <itemList>
        <#list itemList as item>
            <item name="${item.name}" value="${item.value}" status="${item.status}">
                <description>${item.description}</description>
                <#if item.attributes?has_content>
                    <attributes>
                        <#list item.attributes as attribute>
                            <attribute name="${attribute.name}" value="${attribute.value}"/>
                        </#list>
                    </attributes>
                </#if>
            </item>
        </#list>
    </itemList>
    </#if>
    <version value="${version}"/>
    <date>${date}</date>
    <author>${author}</author>
    <comments>
        <#if comments?has_content>
            <#list comments as comment>
                <comment>${comment}</comment>
            </#list>
        </#if>
    </comments>
</configuration>

模板说明

<item>: 表示单个配置项,包含名称、值和状态等信息。
<attributes>: 可选元素,包含配置项的属性列表。
<author>: 添加了作者信息,标识配置文件的创建者。
<comments>: 包含可选的注释信息,用于提供额外的上下文。

模板标签与标识含义

4.1 模板标签

<#if>:条件判断标签,用于检查变量是否存在或有内容。
用法示例:<#if condition> ... </#if>
<#list>:循环标签,用于遍历集合。
用法示例:<#list collection as item> ... </#list>
${}:变量插值,用于输出数据模型中的值。
用法示例:${variable}
?has_content:检查变量是否有内容,返回布尔值。
用法示例:variable?has_content
?size:获取集合的大小。
用法示例:collection?size

4.2 模板标签属性参数说明

name:配置项的名称,标识该项的唯一性。
示例:<item name="${item.name}">
value:配置项的值,表示该项的具体内容。
示例:<item value="${item.value}">
status:配置项的状态,表示该项的启用或禁用状态。
示例:<item status="${item.status}">
description:对配置项的描述,提供更多上下文信息。
示例:<description>${item.description}</description>
attributes:可选属性,包含额外的配置信息。
示例:<attribute name="${attribute.name}" value="${attribute.value}"/>

DOM4J生成XML方式

优点

编程方式:通过Java代码直接构建XML,适合简单结构的生成。
类型安全:直接使用Java对象,避免了模板解析的潜在错误。
灵活性:适合动态生成XML,不依赖外部模板文件。

示例代码

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import org.dom4j.DocumentHelper;

import java.io.FileOutputStream;

public class XMLGenerator {
    public void generateXML() {
        Document document = DocumentHelper.createDocument();
        Element root = document.addElement("configuration");

        Element itemList = root.addElement("itemList");

        for (Item item : itemListData) {
            Element itemElement = itemList.addElement("item");
            itemElement.addAttribute("name", item.getName());
            itemElement.addAttribute("value", item.getValue());
            itemElement.addAttribute("status", item.getStatus());
            itemElement.addElement("description").setText(item.getDescription());

            if (item.getAttributes() != null) {
                Element attributes = itemElement.addElement("attributes");
                for (Attribute attribute : item.getAttributes()) {
                    Element attributeElement = attributes.addElement("attribute");
                    attributeElement.addAttribute("name", attribute.getName());
                    attributeElement.addAttribute("value", attribute.getValue());
                }
            }
        }

        root.addElement("version").addAttribute("value", "1.0");
        root.addElement("date").setText("2024-08-23");
        root.addElement("author").setText("Your Name");

        try (FileOutputStream fileOutputStream = new FileOutputStream("output.xml")) {
            OutputFormat format = OutputFormat.createPrettyPrint();
            XMLWriter writer = new XMLWriter(fileOutputStream, format);
            writer.write(document);
            writer.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

对比总结

生成方式:FreeMarker基于模板文件,适合动态内容;DOM4J通过Java代码构建,适合简单结构。
可读性:FreeMarker模板结构清晰,易于维护;DOM4J代码较长,结构不如模板清晰。
灵活性:FreeMarker支持复杂逻辑和条件判断;DOM4J动态生成XML,但不支持复杂条件。
类型安全:FreeMarker依赖于模板解析,可能出现运行时错误;DOM4J直接使用Java对象,类型安全。
适用场景:FreeMarker适合需要频繁修改的动态内容生成;DOM4J适合简单、固定结构的XML生成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2068598.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis持久化RDB/AOF

一、RDB RDB&#xff08;Redis DataBase&#xff09; &#xff1a;RDB 持久性以指定的时间间隔执行数据集的时间点快照&#xff0c;就是把某一刻的数据和状态以文件的形式写到磁盘上。这个快照文件称为RDB文件&#xff08;dump.rdb&#xff09;。 自动触发 Redis7版本&#xff…

Jira使用指南(高级搜索JQL/统计/面板设计)

1.Jira使用指南 Jira使用指南.pdf 上面的pdf比较详细的介绍了Jira的使用&#xff0c;目录如下&#xff1a; 或者从Jira的中文官网获得更多的使用指南 JIRA入门教程 1.1JIRA如何根据过滤出我关注的单子 https://www.cnblogs.com/wzxbro/p/17203914.html 登录JIRA平台&#…

利用子域的System权限通往父域

前言 最近翻阅笔记发现一篇文章提到通过子域的System权限可以突破获取到父域权限&#xff0c;本文将对此技术进行尝试复现研究。 利用分析 环境信息&#xff1a; 子域&#xff1a;187、sub.cs.org 父域&#xff1a;197、cs.org首先通过在子域的域控机器上打开mmc.exe->连…

Git 版本控制操作

1. 版本回退 Git 能够管理⽂件的历史版本&#xff0c;这是版本控制器重要的能⼒。如果有⼀天你发现之前前的⼯作做的出现了很⼤的问题&#xff0c;需要在某个特定的历史版本重新开始&#xff0c;这个时候&#xff0c;就需要版本回退的功能了。 执⾏ git reset 命令⽤于回退版…

Radiance Field Learners As UAV First-Person Viewers 翻译

作为无人机第一人称视角的辐射场学习者 引言。第一人称视角&#xff08;FPV&#xff09;在无人机飞行轨迹的革新方面具有巨大的潜力&#xff0c;为复杂建筑结构的导航提供了一条令人振奋的途径。然而&#xff0c;传统的神经辐射场&#xff08;NeRF&#xff09;方法面临着诸如每…

Python 爬虫入门(十二):正则表达式「详细介绍」

Python 爬虫入门&#xff08;十二&#xff09;&#xff1a;正则表达式 前言一、正则表达式的用途二、正则表达式的基本组成元素2.1 特殊字符2.2 量词2.3 位置锚点2.4 断言2.5 字符集2.6 字符类2.6.1 基本字符类2.6.2 常见字符类简写2.6.3 POSIX字符类2.6.4 组合使用 三、 正则表…

用Python移除PowerPoint演示文稿中的所有超链接

在某些PPT使用场景中&#xff0c;比如需要打印幻灯片或者超链接已失效时&#xff0c;演示文稿中的超链接可能会成为一种干扰。这时我们需要移除PowerPoint演示文稿中的超链接&#xff0c;以确保演示的连贯性和专业性。通过使用Python&#xff0c;我们可以高效地批量处理这一任务…

Java | Leetcode Java题解之第365题水壶问题

题目&#xff1a; 题解&#xff1a; class Solution {public boolean canMeasureWater(int x, int y, int z) {if (x y < z) {return false;}if (x 0 || y 0) {return z 0 || x y z;}return z % gcd(x, y) 0;}public int gcd(int x, int y) {int remainder x % y;w…

提升录制效率,这些录屏软件快捷键你不可不知

我们工作、学习及娱乐中不可或缺的工具有很多&#xff0c;别的不知道肯定有录屏工具的一席之地吧。如果平常频繁的使用这个工具想要它更高效那不妨试试使用录屏快捷键&#xff0c;这次我们来讨论下大家都在用的那些录屏工具吧。 1.福昕录屏大师 链接&#xff1a;www.foxitsof…

案例分享—国外简洁UI设计界面赏析

简洁的页面遵循“少即是多”的设计哲学&#xff0c;强调通过精简元素、色彩和布局来突出核心功能&#xff0c;使设计作品更加直观易用&#xff0c;提升用户体验&#xff1b; 深受现代主义与极简主义思潮影响&#xff0c;这些流派鼓励去除冗余&#xff0c;追求形式与功能的完美结…

Stable Diffusion 与 DALL·E3 的深度解析

一、Stable Diffusion 的全方位解读 Stable Diffusion 是一款令人瞩目的 AI 绘画工具&#xff0c;其显著特点之一便是开源免费。这意味着用户无需支付费用即可自由使用和修改&#xff0c;为广大创作者提供了极大的便利。然而&#xff0c;要想充分发挥其功能&#xff0c;对电脑…

鸿蒙Harmony编程开发:HTTPS服务端证书四种校验方式

如果你还是使用HttpRequest的话&#xff0c;答案是否定的。但是&#xff0c;鸿蒙开发者很贴心的推出了远场通信服务&#xff0c;可以使用rcp模块的方法发起请求&#xff0c;并且在请求时指定服务端证书的验证方式&#xff0c;关键点就在SecurityConfiguration接口上&#xff0c…

K8S故障排查可视化指南 —— 筑梦之路

在线查看 中文版&#xff1a;http://114.132.181.71:8080/book/71 英文版&#xff1a;http://114.132.181.71:8080/book/70 A visual guide on troubleshooting Kubernetes deployments

Python二级(易错点讲解)

今天在做真题时&#xff0c;遇到了不少坑的地方&#xff0c;跟大家一起分享&#xff0c;感谢大家观看和关注。 祝大家都能在20多天后顺利通过Python二级。 一.continue循环 大家都知道continue关键字在编程中用于跳过当前循环的剩余迭代并直接开始下一次迭代。 好&#xff0c;…

怎么整合spring security和JWT

什么是spring security spring security是一个安全框架,它里面有过滤器链,可以多次过滤,其实他可以给前端的cookie传入一个jsessionid,都可以不使用jwt也能完成校验 第一步:导入依赖 <!-- springboot security --> <dependency><groupId>org.springframew…

整合Spring和Mybatis(在整合DBCP基础上修改)

整合DBCP请参考主页文章spring整合DBCP 前期准备工作 删除dao层的实现类&#xff0c;只留下接口即可。 在resource文件夹下导入dao层对应的xml文件以及mybatis的核心配置文件&#xff0c;配置文件中只写加载映射文件的代码即可&#xff0c;如下所示 <?xml version"…

Kakfa的核心概念-Replica副本(kafka创建topic并指定分区和副本的两种方式)

Kakfa的核心概念-Replica副本&#xff08;kafka创建topic并指定分区和副本的两种方式&#xff09; 1、kafka命令行脚本创建topic并指定分区和副本2、springboot集成kafka创建topic并指定分区和副本2.1、springboot集成kafka2.1.1、springboot集成kafka创建topic并指定5个分区和…

java BIO NIO AIO

结合JavaGuideIO部分内容食用更佳 在Java中&#xff0c;I/O&#xff08;输入/输出&#xff09;操作主要有三种模型&#xff1a;BIO&#xff08;Blocking I/O&#xff0c;阻塞I/O&#xff09;、NIO&#xff08;Non-blocking I/O&#xff0c;非阻塞I/O&#xff09;和AIO&#x…

怎样写好提示词(Prompt) 一

提示工程是一门新兴的学科&#xff0c;专注于以最佳实践构建LLM的最佳输入&#xff0c;从而尽可能以程序化方式生成目标输出。AI工程师必须知道如何与AI进行交互&#xff0c;以获取可用于应用程序的有利结果。此外&#xff0c;AI工程师还必须知道如何正确提问和编写高质量的提示…

python小游戏——躲避球(可当课设)

游戏简介&#xff1a; 没有美术&#xff0c;画面简洁&#xff08;懒得做&#xff09;。玩家控制小球躲避敌人&#xff08;上下左右&#xff0c;闪避&#xff09;&#xff0c;敌人体积越大速度越慢&#xff0c;随机生成道具球&#xff08;目前只有生命球&#xff09;&#xff0…