关于通用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;
}
}
- 模板在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模板文件的常用语法,如判空,循环等
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
