最近项目开发中遇到一个问题,访问接口不再通过url地址请求的方式,而是
通过socket发送xml格式的报文到指定服务器来进行信息的统一认证。。
因此组装xml格式的报文字符串以及解析服务器返回的xml格式的字符获得所需数据成了
解决问题的关键。。在这之前,以为会有点难。。。做完之后,然并卵,也就那么一回事。。。
LZ主要用的xStream类。。这个类的完美地解决了XML文档和JAVA对象之间的转换。。
由于刚刚接触这个类。。。对于里面提供的很多功能还没细细挖掘。。只是简单地实现了
我想要实现的功能。。待后续有时间再细嚼慢咽、细细品味。。。
Entrance类:主要提供程序运行的入口。。。
该类中包含了一个静态的generateHtml()方法、用于生成XML格式的字符串
package com.linjm.xml; public class Entrance { public static void main(String[] args) { String html = generateHtml(); System.out.println("############################"); TagEntity tagEntity = XMLUtil.fromXml(html, TagEntity.class); System.out.println("解析HTML:"); System.out.println("title:" + tagEntity.getHead().getTitle()); System.out.println("输出类信息:"); System.out.println(tagEntity.toString()); } public static String generateHtml() { TagEntity tagEntity = new TagEntity(); Head head = Init.initHead(); Body body = Init.initBody(); tagEntity.setHead(head); tagEntity.setBody(body); String html = XMLUtil.toXml(tagEntity); String top = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n"; System.out.println("生成HTML:\n" + top + html); return html; } }
先看下程序的运行结果吧。。。看完我们再看后面具体的代码结构。。。
生成HTML: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Title</title> <meta>Meta</meta> <js>JavaScript</js> <css>CSS</css> </head> <body> <div>Div</div> <span>Span</span> <font>Front</font> <input>Input</input> </body> </html> ############################ 解析HTML: title:Title 输出类信息: head:[title:Title,meta:Meta,js:JavaScript,css:CSS],body:[div:Div,input:Input,font:Front,span:Span]
Init类:主要用于初始化XML中的Head和Body标签内的子标签内容。。。
package com.linjm.xml; public class Init { public static Head initHead() { Head head = new Head(); head.setTitle("Title"); head.setMeta("Meta"); head.setJs("JavaScript"); head.setCss("CSS"); return head; } public static Body initBody() { Body body = new Body(); body.setDiv("Div"); body.setFont("Front"); body.setInput("Input"); body.setSpan("Span"); return body; } }
TagEntity类:主要是包含了两个字段:head和body。
也是最终xml中呈现的head标签和body标签。。。
通过@XStreamAlias注解的方式定义标签中的xml显示内容。。。
大家可以根据自己的需求定义不同的标签。。。
head和body标签可根据需求不同而不同。。。
package com.linjm.xml; import com.thoughtworks.xstream.annotations.XStreamAlias; @XStreamAlias("html") public class TagEntity { @XStreamAlias("head") private Head head; @XStreamAlias("body") private Body body; public Head getHead() { return head; } public void setHead(Head head) { this.head = head; } public Body getBody() { return body; } public void setBody(Body body) { this.body = body; } public String toString() { String str = "head:[" + "title:"+ head.getTitle() + ",meta:"+ head.getMeta() + ",js:"+ head.getJs() + ",css:"+ head.getCss() + "]," + "body:[" + "div:"+ body.getDiv() + ",input:"+ body.getInput() + ",font:"+ body.getFont() + ",span:"+ body.getSpan() + "]"; return str; } }
Head类:该实体类中定义了head标签中的子标签属性字段。。 。
head标签中的子标签可依据具体实际情况而定
package com.linjm.xml; import com.thoughtworks.xstream.annotations.XStreamAlias; public class Head { @XStreamAlias("title") private String title; @XStreamAlias("meta") private String meta; @XStreamAlias("js") private String js; @XStreamAlias("css") private String css; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getMeta() { return meta; } public void setMeta(String meta) { this.meta = meta; } public String getJs() { return js; } public void setJs(String js) { this.js = js; } public String getCss() { return css; } public void setCss(String css) { this.css = css; } }
Body类:该实体类中 定义了body标签中的子标签属性字段。。。
body标签中的子标签可依据具体实际情况而定。。。
package com.linjm.xml; import com.thoughtworks.xstream.annotations.XStreamAlias; public class Body { @XStreamAlias("div") private String div; @XStreamAlias("span") private String span; @XStreamAlias("font") private String font; @XStreamAlias("input") private String input; public String getDiv() { return div; } public void setDiv(String div) { this.div = div; } public String getSpan() { return span; } public void setSpan(String span) { this.span = span; } public String getFont() { return font; } public void setFont(String font) { this.font = font; } public String getInput() { return input; } public void setInput(String input) { this.input = input; } }
XMLUtil类:该类定义了xStream中组装XML字符串和解析XML字符串封装方法。。。
toXml()方法用于将Java对象转为XML字符串;
fromXml()方法用于解析XML字符串转换为Java对象。
package com.linjm.xml; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.DomDriver; public class XMLUtil { /** * @desc 将JAVA对象转XML字符串 * @author JimLy * @date 20160423 * */ public static String toXml(Object obj) { XStream xs = new XStream(new DomDriver()); xs.processAnnotations(obj.getClass()); return xs.toXML(obj); } /** * @desc 将XML字符串转JAVA对象 * @author JimLy * @date 20160423 * */ @SuppressWarnings("unchecked") public static <T> T fromXml(String xmlStr, Class<T> cls) { XStream xs = new XStream(new DomDriver()); xs.processAnnotations(cls); T obj = (T) xs.fromXML(xmlStr); return obj; } }
代码实现很简单,也并不是很复杂。。。基本上都是可以看得懂的。。。
为了不使代码篇幅太长,我还是分多个类文件写、就不都写在一个类文件中。。
程序结构设计的有点不合理,,有点啰嗦。。目前只体现出程序的功能。。。
程序设计上需要优化的地方另当别论。。。
需要用到的jar包:xstream-1.4.7.jar