通用xml报文创建和解析

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

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值