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