XStream使用

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;
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章