最近项目开发中遇到一个问题,访问接口不再通过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;
}
}
代码实现很简单,也并不是很复杂。。。基本上都是可以看得懂的。。。
为了不使代码篇幅太长,我还是分多个类文件写、就不都写在一个类文件中。。
程序结构设计上存在点瑕疵,,有点啰嗦。。目前只体现出程序的功能。。。
对于xStream也是初次涉及,,也许、大概可能吧、会存在更好的实现方法以及
程序设计上需要优化的地方另当别论。。。
看完博文觉得对这个有点兴趣的话,可以自己动手code一番。。。
也不枉花了这么多时间来看,,既然看了就得有点收获不是吗。。。
需要用到的jar包:xstream-1.4.7.jar