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

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