关于通用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模板文件的常用语法,如判空,循环等

总结

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

相关文章

  • HashSet和TreeSet使用方法的区别解析

    HashSet和TreeSet使用方法的区别解析

    这篇文章主要介绍了HashSet和TreeSet使用方法的区别解析,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • SpringBoot实现登录校验(JWT令牌)

    SpringBoot实现登录校验(JWT令牌)

    JWT全称为JSON Web Token,是一种用于身份验证的开放标准,本文主要介绍了SpringBoot实现登录校验(JWT令牌),具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • 详解spring-data-jpa中jpql的投影查询

    详解spring-data-jpa中jpql的投影查询

    投影查询,就是仅仅检索表的部分字段。而不是粗暴的 SELECT * FROM...检索出所有列数据,这篇文章主要介绍了spring-data-jpa中jpql的投影查询,需要的朋友可以参考下
    2021-09-09
  • springAOP中用joinpoint获取切入点方法的参数操作

    springAOP中用joinpoint获取切入点方法的参数操作

    这篇文章主要介绍了springAOP中用joinpoint获取切入点方法的参数操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • ssm项目实现用户登陆持久化(token)

    ssm项目实现用户登陆持久化(token)

    这篇文章主要介绍了ssm项目实现用户登陆持久化(token),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • JAVA注解代码详解一篇就够了

    JAVA注解代码详解一篇就够了

    这篇文章主要介绍了Java注解详细介绍,本文讲解了Java注解是什么、Java注解基础知识、Java注解类型、定义Java注解类型的注意事项等内容,需要的朋友可以参考下
    2021-07-07
  • springboot项目中controller层与前端的参数传递方式

    springboot项目中controller层与前端的参数传递方式

    这篇文章主要介绍了springboot项目中controller层与前端的参数传递方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • Java Fluent Mybatis实战之构建项目与代码生成篇下

    Java Fluent Mybatis实战之构建项目与代码生成篇下

    Java中常用的ORM框架主要是mybatis, hibernate, JPA等框架。国内又以Mybatis用的多,基于mybatis上的增强框架,又有mybatis plus和TK mybatis等。今天我们介绍一个新的mybatis增强框架 fluent mybatis
    2021-10-10
  • Java中关于 null 的几种处理方式详解

    Java中关于 null 的几种处理方式详解

    这篇文章主要介绍了Java中关于 null 的几种处理方式,关于 null ,你应该知道下面这几件事情来有效的了解 null ,从而避免很多由 null 引起的错误,具体细节跟随小编一起学习下吧
    2021-10-10
  • 通过Java实现带干扰线的验证码

    通过Java实现带干扰线的验证码

    带干扰线的验证码是一种常见的安全验证方式,目的是通过图像中的干扰线增加机器识别的难度,确保只有人类用户能够顺利识别并输入验证码,本项目的目的是通过Java实现一个带有干扰线的验证码生成器,需要的朋友可以参考下
    2025-02-02

最新评论