系统对外提供接口,或者系统调用外部接口,常常会使用xml格式作为接口数据传输格式(json数据,txt文本数据亦可),下面讲讲xml数据的生成和解析。
首先讲讲xml数据生成,通常可以用两种方法,使用Xstream直接将java bean转化为xml文件数据,另外一种使用freemarker模板渲染xml数据,这两种方法各有利弊,下面针对这两种方法进行一下分析。
java bean转为xml文件数据
使用Xstream库可以直接将java bean转化为xml文件,当然亦可将xml文件数据转化为java bean,Xstream官网给出xstream解释如下图:

使用XStream库之前首先要引用jar,pom文件中加入依赖:
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.7</version>
</dependency>
转换代码:
// 新建domDriver对象
private static DomDriver domDriver = new DomDriver("UTF-8", new XmlFriendlyNameCoder("-_", "_"));
public static String toXml(Object obj) {
XStream xStream = new XStream(domDriver);
xStream.processAnnotations(obj.getClass());
return xStream.toXML(obj);
}
新建domDriver对象,设置编码为UTF-8
,然后处理obj中给Xstream用于解析的注解,最后转化为xm文件格式的字符型数据。
大家有可能看的懵懵懂懂,直接上代码可以看的更直观,XStreamTest类的注解如下:
@XStreamAlias("xml")
public class XStreamTest {
@XStreamAlias("test")
private String test;
@XStreamAlias("succ")
private String succ;
@XStreamAlias("data")
private Data data;
@XStreamAlias("res")
private String res;
this.res = res; }
@XStreamAlias("data")
class Data {
@XStreamAlias("trades")
private String trades;
@XStreamAlias("total_results")
private String total_results;
@XStreamAlias("has_next")
private boolean has_next;
}
}
考虑文章篇幅,删除了XStreamTest类的set get方法,XStreamTest经toXml()
转化后的结果是:
<xml>
<test>test</test>
<succ>true</succ>
<data>
<trades>1</trades>
<total_results>11</total_results>
<has_next>false</has_next>
</data>
<res>succ</res>
</xml>
有上述转化流程可知,java bean转化后的格式是固定的,当接口要求可变格式时,使用XStream方法是不可行的。下面讲讲使用freemarker模板渲染方式生成xml格式数据。
使用freemarker模板渲染方式生成xml文件数据
Spring MVC+freemarker框架,get请求完将数据put至ModelMap中,dispatchServlet使用freemarker模板引擎,会将ModelMap中数据渲染至.ftl文件中,生成页面。
使用此原理,直接调用freemarker模板引擎渲染方法,将数据渲染至.ftl文件,生成所需要的xml格式数据,然后执行ResponseWriter.write(xmlData, response);
,返回xml格式数据xmlData。
渲染方法:
public String process(String templatefile, Map<String, Object> param) {
Template template = freeMarkerConfigurer.getConfiguration().getTemplate(templatefile);
StringWriter sw = new StringWriter();
template.process(param, sw);
return sw.toString();
}
templatefile是.ftl文件模板数据,param是要渲染至templatefile的数据。template.process(param, sw);
是底层freemarker模板渲染执行方法,Spring MVC+freemarker框架也调用此方法,有兴趣的朋友具体可从DispatchServlet.doDispatch()进行源码跟踪,这里不再陈述。
xml文件解析成java bean
不多说废话,直接上代码,写的很清楚。
public static <T> T toBean(String xmlStr, Class<T> clazz) {
XStream xStream = new XStream(domDriver);
xStream.processAnnotations(clazz);
xStream.ignoreUnknownElements();
T obj = (T) xStream.fromXML(xmlStr);
return obj;}
本博客为博主原创,如需转载请说明出入xml格式接口数据编程实战,写作不易,如果本文对您有所帮忙,请点个赞,您的支持是我写作的最大动力。
网友评论