简单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);
}
}
结果: