关于通用xml报文创建和解析方式

 更新时间:2025年08月28日 10:42:41   作者:Winson.J  
文章介绍简单XML报文的结构特点(3-4层节点)及使用Freemarker生成的方法,包括创建Maven项目、配置依赖、模板文件位置(resource目录)和测试代码示例,并预告后续将讲解Freemarker模板语法

简单XML报文

简单XML是指结构简单,没有很多节点层次的报文。通常只有3到4层子节点。这种结构很方便创建和解析 。

示例如下

<?xml version="1.0" encoding="UTF-8"?>
<Message>
	<Head>
		<Element>10</Element>
		.........
	</Head>
	<Body>
		<Element>00</Element>
		.........
	</Body>
</Message>

如上图,根节点一层,head,body一层,具体业务要素一层。

Freemarker,强烈推荐组xml的工具

maven依赖

	<!-- freemarker jar -->
	<dependency>
		<groupId>org.freemarker</groupId>
		<artifactId>freemarker</artifactId>
		<version>2.3.20</version>
	</dependency>
	<!-- logback 日志工具 -->
	<dependency>
    	<groupId>org.slf4j</groupId>
	    <artifactId>slf4j-api</artifactId>
	    <version>1.7.7</version>
	</dependency>
	<dependency>
	    <groupId>ch.qos.logback</groupId>
	    <artifactId>logback-core</artifactId>
	    <version>1.1.7</version>
	</dependency>
	<dependency>
	    <groupId>ch.qos.logback</groupId>
	    <artifactId>logback-access</artifactId>
	    <version>1.1.7</version>
	</dependency>
	<dependency>
	    <groupId>ch.qos.logback</groupId>
	    <artifactId>logback-classic</artifactId>
	    <version>1.1.7</version>
	</dependency>

建一个简单maven项目,引入依赖,创建工具类

package com.xml.create.utils;

import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;

public class FreeMarkerUtil {
	private static Logger logger = LoggerFactory.getLogger(FreeMarkerUtil.class);
	public final static String TEMPLATE_SUFFIX = ".ftl";
	
	private static Configuration tplConfig;
	//模板文件存放目录
	private static String tplDir = "./config/templates";
	private static String encoding = "UTF-8";
	
	/**
	 * 加载所有模板文件
	 * @param tplFileName	模板文件的名称
	 * @param dataMap		数据
	 * @return
	 */
	public static void loadTemplates() {
		tplConfig = new Configuration();
		try {
			//加载文件系统下的模板,推荐
			tplConfig.setDirectoryForTemplateLoading(new File(tplDir));
			//加载类路径下的模板,如果模板放在resource目录下,使用这种方式
			//这种方式不推荐,因为打包时,会打到jar里,不方便修改模板
//			tplConfig.setClassForTemplateLoading(FreeMarkerUtil.class, "/templates");
			tplConfig.setObjectWrapper(new DefaultObjectWrapper());
			tplConfig.setDefaultEncoding(encoding);
			
		} catch (Exception e) {
			logger.info("初始化FreeMarkerUtil: ", e);
		}
	}
	/**
	 * 数据放在map里
	 * @param tplFileName	模板文件的名称
	 * @param dataMap		数据
	 * @return
	 */
	public static String createXml(String tplFileName, Map<String, Object> dataMap) {
		StringWriter out = null;
		 try {
			Template template = tplConfig.getTemplate(tplFileName);
			out = new StringWriter();
			template.process(dataMap, out);
			out.flush();
			
			return out.toString();
		} catch (IOException e) {
			logger.info("IOException,组报文失败: ", e);
		} catch (TemplateException e) {
			logger.info("TemplateException,组报文失败: ", e);
		}finally {
			if (out != null) {
				try {
					out.close();
				} catch (IOException e) {
				}
			}
		}
		 
		 return null;
	}
	/**
	 * 数据放在对象里
	 * @param tplFileName	模板文件的名称
	 * @param dataMap		数据
	 * @return
	 */
	public static String createXml(String tplFileName, Object data) {
		StringWriter out = null;
		 try {
			Template template = tplConfig.getTemplate(tplFileName);
			out = new StringWriter();
			template.process(data, out);
			out.flush();
			
			return out.toString();
		} catch (IOException e) {
			logger.info("IOException,组报文失败: ", e);
		} catch (TemplateException e) {
			logger.info("TemplateException,组报文失败: ", e);
		}finally {
			if (out != null) {
				try {
					out.close();
				} catch (IOException e) {
				}
			}
		}
		 
		 return null;
	}
}
  • 模板在resource下

  • 模板在文件目录里

模板文件test.ftl内容

<?xml version="1.0" encoding="UTF-8"?>
<Message>
	<Head>
		<Test>${test}</Test>
	</Head>
	<Body>
		<Test1>${test1}</Test1>
	</Body>
</Message>

测试代码

package com.xml.create;

import java.util.HashMap;
import java.util.Map;

import com.xml.create.utils.FreeMarkerUtil;

public class Test {

	public static void main(String[] args) {
		//加载模板
		FreeMarkerUtil.loadTemplates();
		
		String ftlName = "test.ftl";
		//测试数据
		Map<String, Object> dataMap = new HashMap<String, Object>();
		dataMap.put("test", "aaaa");
		dataMap.put("test1", "bbb");
		//按模板配置生成字符串
		String xml = FreeMarkerUtil.createXml(ftlName, dataMap);
		System.out.println(xml);
	}
}
  • 结果:

后续介绍,Freemarker模板文件的常用语法,如判空,循环等

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java中的排序Comparator类用法详解

    Java中的排序Comparator类用法详解

    这篇文章主要介绍了Java中的排序Comparator类用法详解,Comparator 类常作为 sorted() 方法的参数传递给 sorted 方法,用来解决给集合排序,自定义排序规则的问题,需要的朋友可以参考下
    2023-08-08
  • 深度解析SpringBoot内嵌Web容器

    深度解析SpringBoot内嵌Web容器

    这篇文章主要给大家介绍SpringBoot的内嵌Web容器,SpringBoot将Web容器进行了内嵌,我们只需要将项目打成一个jar包,就可以运行了,大大省略了开发成本,那么SpringBoot是怎么实现的呢,我们今天就来详细介绍
    2023-06-06
  • Java日常记录之查看Maven本地仓库的位置

    Java日常记录之查看Maven本地仓库的位置

    这篇文章主要介绍了Maven本地仓库的用途和配置方法,它提供了查看、修改本地仓库路径的步骤,包括检查settings.xml文件、使用Maven命令和查看输出日志,需要的朋友可以参考下
    2024-12-12
  • java并发无锁多线程单线程示例详解

    java并发无锁多线程单线程示例详解

    这篇文章主要为大家介绍了java并发无锁多线程单线程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • SpringBoot 策略模式实现切换上传文件模式

    SpringBoot 策略模式实现切换上传文件模式

    策略模式是指有一定行动内容的相对稳定的策略名称,这篇文章主要介绍了SpringBoot 策略模式 切换上传文件模式,需要的朋友可以参考下
    2023-11-11
  • Java中连接Mongodb进行增删改查的操作详解

    Java中连接Mongodb进行增删改查的操作详解

    MongoDB是一个基于分布式文件存储的数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案,本文给大家介绍了Java中连接Mongodb进行操作,文中有详细的代码示例供大家参考,需要的朋友可以参考下
    2024-06-06
  • 详解Java中Collections.sort排序

    详解Java中Collections.sort排序

    Comparator是个接口,可重写compare()及equals()这两个方法,接下来通过本文给大家介绍Java中Collections.sort排序,需要的的朋友参考下吧
    2017-04-04
  • swagger文档增强工具knife4j使用图文详解

    swagger文档增强工具knife4j使用图文详解

    这篇文章主要介绍了swagger文档增强工具knife4j使用详解,想要使用knife4j非常简单,只要在Springboot项目中引入knife4j的依赖即可,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • Java读取properties配置文件时,出现中文乱码的解决方法

    Java读取properties配置文件时,出现中文乱码的解决方法

    下面小编就为大家带来一篇Java读取properties配置文件时,出现中文乱码的解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • 每天练一练Java函数与算法Math函数总结与字符串转换整数

    每天练一练Java函数与算法Math函数总结与字符串转换整数

    这篇文章主要介绍了Java函数与算法Math函数总结与字符串转换整数,每天练一练,水平在不知不觉中提高,需要的朋友快过来看看吧
    2021-08-08

最新评论