java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > 通用xml报文创建和解析

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

作者: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;
	}
}

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

总结

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

您可能感兴趣的文章:
阅读全文