XStream使用
2016-05-02 20:19
369 查看
Xstream类是用XML和java相互转换的类,用法:
java转xml:XStream.toXML(Object obj)
xml转java:XStream.fromXML(String str)
如下形式的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的属性节点
附上有一篇使用源码:
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; } }
相关文章推荐
- HDU 1312 Red and Black(BFS,DFS)
- java设计模式-Builder创建者模式
- String类--单例模式等面试题
- 常用数组Array方法: indexOf、filter、forEach、map、reduce使用实例
- [编译原理]学习笔记(二)——文法和语言
- ODPS MapReduce入门 - 推荐商品
- 作业七—“南通大学教务管理系统微信公众号”用户体验分析
- 冒泡排序
- ubuntu的apt-get update失败
- Android4.4 增加的/system/priv-app system/delapp跟 原来的/system/app 有啥区别呢?
- [汇编学习]在代码段使用栈
- 实验7 BindService模拟通信
- 项目1-点-圆-圆柱类族的设计(2)
- bzoj 4025: 二分图 lct
- Python string find
- ubuntu22端口开启失败解决
- 并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法
- UIDatePicker的使用
- 批量重命名文件
- 求解模线性方程