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

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 加载的模板*/@Overridepublic 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内容及文件信息*/@Overridepublic 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.rhkb.cn/news/411920.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三分钟总结开源流程表单的优势特点

实现流程化办公&#xff0c;可以借助低代码技术平台、开源流程表单的优势特点。作为当前较为理想的平台产品&#xff0c;低代码技术平台凭借够灵活、好操作、可视化界面的优势特点&#xff0c;得到了通信业、医疗、高校等很多行业客户朋友的喜爱与支持。今天一起来看看开源流程…

联华证券-新手炒股入门指南:学习路径与注意事项

学习炒股是一个循序渐进的过程&#xff0c;以下是入门建议以及需要注意的事项&#xff1a; 学习炒股的入手步骤 掌握基础知识&#xff1a; 股票市场基础&#xff1a;了解什么是股票、股市的运作机制、股票的种类等基本概念。 常用术语&#xff1a;熟悉如市盈率&#xff08;P/…

ET6框架(三)前后端通讯分析

文章目录 一、信息的通讯二、网络通讯协议的“理像模型”三、网络通讯协议的“四层模型”四、什么是 Socket&#xff1f;五、Socket通讯流程 一、信息的通讯 网络消息的发送类似于邮寄信件的流程&#xff0c;需要一个地址及收件人。 在网络通讯中通常我们需要一个IP地址及端口…

uni-app启动本地开发环境,修改默认端口号

vite.config.js: import { defineConfig } from "vite"; import uni from "dcloudio/vite-plugin-uni";// https://vitejs.dev/config/ export default defineConfig({server: {port: 3006,},plugins: [uni()], });人工智能学习网站 https://chat.xutong…

趣味算法------过河卒

目录 ​编辑 题目描述 解题思路 具体代码 总结 问题描述&#xff1a; 解决方案&#xff1a; 代码实现&#xff1a; 关键点&#xff1a; 题目描述 棋盘上 A 点有一个过河卒&#xff0c;需要走到目标 B 点。卒行走的规则&#xff1a;可以向下、或者向右。同时在棋盘上 C…

自动化通过cmd命令行并以特定账户连接到远程机器

1 建一个taskschedule运行cmd命令 2 cmd命令示例&#xff1a; 机器名加域名 mstsc /v:"<MachineName>.xxx.xxx.com"或者是机器IP地址 mstsc /v:"10.148.66.178"3 设置用特定账户登陆 用户名可以写 <要连接的机器名><用户名> 勾选“记住…

川崎机器人维修请开启马达电源报警故障

‌川崎机器人故障代码主要用于指示机器人的不同运行问题和状态&#xff0c;帮助快速识别和解决这些问题。‌Kasawaki机械手故障代码通常以字母和数字的组合形式出现&#xff0c;其中字母代表故障的类型&#xff0c;而数字则是具体的代码编号。这些代码可以分为‌P‌代表操作错误…

05:创建逻辑软件元件库

1.创建逻辑软件元件库 点击 “编辑电参数” 1.1常规设置 1.2PCB封装 1.3门 1.4管脚 1.5检查元件 点击确定 1.6点击保存 2.处理重叠问题 2.1查看处理后的显示

《JavaEE进阶》----5.<SpringMVC②剩余基本操作(CookieSession)>

Cookie和Session简介。 Spring MVC的请求中 Cookie的设置和两种获取方式 Session的设置和三种获取方式。 三、&#xff08;接上文&#xff09;SpringMVC剩余基本操作 3.2postman请求 3.2.10 获取Cookie和Session 1.理解Cookie 我们知道HTTP协议自身是“无状态”协议。 &qu…

XtQuant接口概述,想用miniQMT做量化哪家券商支持?

XtQuant.XtData 行情模块 xtdata是xtquant库中提供行情相关数据的模块&#xff0c;本模块旨在提供精简直接的数据满足量化交易者的数据需求&#xff0c;作为python库的形式可以被灵活添加到各种策略脚本中。 主要提供行情数据&#xff08;历史和实时的K线和分笔&#xff09;、…

《黑神话悟空》:国产3A游戏的崛起与AI绘画技术的融合

一、游戏简介 近年来&#xff0c;国产3A游戏《黑神话悟空》以其精美的画面、丰富的剧情和独特的文化底蕴吸引了众多玩家的关注。这款游戏以中国古典名著《西游记》为背景&#xff0c;讲述了孙悟空历经磨难&#xff0c;最终成长为斗战胜佛的故事。在游戏制作过程中&#xff0c;开…

SpringBoot整合Mybatis,Junit (复现之前写的一个SSM项目)

引言 如下是之前写的一个SSM项目&#xff08;纯注解版&#xff09;&#xff0c;现在我们要把它改造成一个SpringBoot项目&#xff0c;以体现SpringBoot的方便。主要需要关注的文件已经用红框标出。 1.config文件夹里面的是Spring&#xff0c;SpringMvc&#xff0c;Mybatis的配…

zoom 会议 javascript 转录例子

一、启动server-to-server zoom api服务&#xff0c;用于创建会议&#xff0c;参考&#xff1a;如何使用Zoom API创建一个会议&#xff1f;-CSDN博客 二、启动meetingsdk-auth-endpoint服务&#xff0c;用于加入会议&#xff0c;参考&#xff1a;zoom 会议机器人web例子-CSDN博…

中国城市经济韧性数据集(2007-2022年)

数据来源&#xff1a;数据来自历年《中国城市统计NJ》、各省市《统计NJ》及《中国区域经济统计NJ》 时间范围&#xff1a;2007-2022年 数据范围&#xff1a;中国地级市样例数据&#xff1a; 包含内容&#xff1a; 全部内容下载链接&#xff08;原始数据计算代码最终数据&…

【binder】【android12】【2.servicemanager启动——全源码分析】

系列文章目录 可跳转到下面链接查看下表所有内容https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501文章浏览阅读2次。系列文章大全https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501 目录 …

CI/CD之Jenkins用于Linux系统的部署方式汇总

目录 一、前言 二、CI/CD的定义与核心原则 CI/CD在现代软件开发中的重要性 CI/CD与Jenkins的关系 三、Jenkins部署方式汇总 1. 独立服务器部署 &#xff08;1&#xff09;离线安装 &#xff08;2&#xff09;在线安装 2. Docker容器部署 3. Kubernetes集群部署 4. 云…

神经网络卷积层

一、卷积操作 对应位置相乘相加&#xff0c;最终组成一个新的矩阵&#xff0c;实现了降维。 二、代码 import torch import torchvision from torch import nn from torch.nn import Conv2d from torch.utils.data import DataLoaderdataset torchvision.datasets.CIFAR10(&…

2024最全网络安全工程师面试题(附答案),金九银十找工作必看!

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330#rd 《网安面试指南》http://mp.weixin.qq.com/s…

浅析车辆类型检测算法实际应用车辆类型检测算法源码

随着交通运输和物流需求的不断增长&#xff0c;车辆类型检测的准确性和效率成为了一个关键问题。传统的检测方法往往依赖人工和基础的识别技术&#xff0c;面对日益复杂的交通环境&#xff0c;这些方法显得力不从心。幸运的是&#xff0c;智能算法的应用为这一问题带来了突破性…

JavaEE(servlet搭建)

Web开发概述 什么是Web? 所谓web开发,指的是从网页中向后端程序发送请求,与后端程序进行交互。流程图如下&#xff1a; Web服务器是指驻留与因特网上的某种类型计算机程序。 他可以向Web客户端提供文档也可以放置网站文件&#xff0c;让全世界浏览&#xff1b;它是一个容器…