Xstream類是用XML和java相互轉換的類,用法:
java轉xml:XStream.toXML(Object obj)
xml轉java:XStream.fromXML(String str)
如下形式的xml文件:
<xml>
<ToUserName><![CDATA[234]]></ToUserName>
<FromUserName><![CDATA[13]]></FromUserName>
<CreateTime><![CDATA[1462190858013]]></CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<FuncFlag><![CDATA[0]]></FuncFlag>
<Image>
<MediaId><![CDATA[1599633]]></MediaId>
</Image>
</xml>
裏面標籤轉成java的話對應一個類,也就是說這整個xml文件擁有的屬性:五個String類型或者int類型的屬性,外加一個自定義類,這個類裏面只有一個String屬性
XStream使用別名:XStream.alias(String name, Class clazz)將clazz類型的類名用name表示,如果不使用這個方法,那麼這個類將會變成包名+類名錶示
XStream字段別名:XStream.aliasField(String name, Class clazz, Sring fieldName),這個方法的意思表示將clazz所代表的類裏面的fieldName字段換成用name名字表示
注意:這裏面的clazz不是filedName字段的類型,而是fieldName所在類的類型
XStream屬性別名:XStream.useAttributeFor(Class clazz, String fieldName).將那麼fieldName字段變爲clazz的屬性節點
附上有一篇使用源碼:
package com.weixin.util;
import java.io.IOException;
import java.io.InputStream;
import java.io.Writer;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.core.util.QuickWriter;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
import com.thoughtworks.xstream.io.xml.XppDriver;
import com.weixin.model.response.Article;
import com.weixin.model.response.BaseMessage;
import com.weixin.model.response.Image;
import com.weixin.model.response.ImageMessage;
import com.weixin.model.response.NewsMessage;
public class MessageUtil {
/**
* 經過擴展的XStream流,可以生成微信格式的xml文檔
*/
private static XStream xstream = new XStream(new XppDriver() {
public HierarchicalStreamWriter createWriter(Writer out) {
return new PrettyPrintWriter(out) {
boolean cdata = true;
public void startNode(String name, Class clazz) {
super.startNode(name, clazz);
}
public void writeText(QuickWriter writer, String text) {
if(cdata) {
writer.write("<![CDATA[");
writer.write(text);
writer.write("]]>");
} else {
writer.write(text);
}
}
};
}
});
/**
* 解析服務器傳過來的xml文件到map集合裏面
*/
public static Map<String, String> parseXml(HttpServletRequest request) throws IOException, DocumentException {
Map<String, String> map = new HashMap<String, String>();
InputStream in = request.getInputStream();
SAXReader read = new SAXReader();
Document document = read.read(in);
//得到根節點
Element root = document.getRootElement();
//獲取所有節點
List<Element> elements = root.elements();
for( Element e : elements) {
//將節點的名字和節點的值進行映射
map.put(e.getName(), e.getText());
}
//關閉資源
in.close();
return map;
}
/**
* 將類轉換成xml格式的字符串
*/
public static <T> String clazzToXml(T t) {
xstream.alias("xml", t.getClass());
return xstream.toXML(t);
}
/**
* 圖文消息的轉換
* @param news 需要轉換的news對象
* @return
*/
public static String clazzToXml(NewsMessage news) {
xstream.alias("xml", news.getClass());
xstream.alias("item", Article.class);
return xstream.toXML(news);
}
public static String clazzToXml(ImageMessage image) {
xstream.alias("xml", image.getClass());
xstream.aliasField("Image", image.getClass(), "image");
return xstream.toXML(image);
}
/**
* 將數據從BaseMessage類裏面加載到它的子類
*/
public static <T extends BaseMessage> void loadDataFromBase(BaseMessage base, T t) {
t.setFromUserName(base.getFromUserName());
t.setCreateTime(base.getCreateTime());
t.setFuncFlag(base.getFuncFlag());
t.setMsgType(base.getMsgType());
t.setToUserName(base.getToUserName());
}
/**
* 判斷這個對象是不是單純的javaBean,如果是int或String這種類型傳進來的話返回的應該是count
* 如果是一個類裏面只含有String或者int類型,那麼得到的值將是count+1
* @param obj 要判斷的對象
* @param count
* @return
*/
private static int isCell(Object obj, int count) throws IllegalArgumentException, IllegalAccessException {
Class clazz = obj.getClass();
if(clazz == Integer.class || clazz == String.class) {
return count;
}
Field[] fields = clazz.getDeclaredFields();
int t1 = count, t2 = 0;
for(int i = 0; i < fields.length; i++) {
fields[i].setAccessible(true);
Object o = fields[i].get(obj);
Class clazz1 = o.getClass();
if(clazz1 == Integer.class || clazz1 == String.class) {
continue;
}
t2 = isCell(o, count + 1);
if( t1 < t2) {
t1 = t2;
}
}
return t1;
}
}