最近在实现微信公众接口的时候,用到了XStream来实现java Object和XML的相互转换,由于生成的XML需要用到CDATA标签,于是对XPPDriver做了一点扩展,用于支持自定义的注解。
第一步,需要创建自己的标签类XStreamCDATA,用于标记需要加入CDATA标签的field,代码如下:
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD}) public @interface XStreamCDATA { }
第二步,改写XPPDriver,通过Java反射的方式去查找打上XStreamCDATA标签的field,同时需要注意这个field是否也打上了XStreamAlias标签,需要对这种情况做处理,代码如下:
public static XStream createXstream() { return new XStream(new XppDriver() { @Override public HierarchicalStreamWriter createWriter(Writer out) { return new PrettyPrintWriter(out) { boolean cdata = false; Class<?> targetClass = null; @Override public void startNode(String name, @SuppressWarnings("rawtypes") Class clazz) { super.startNode(name, clazz); //业务处理,对于用XStreamCDATA标记的Field,需要加上CDATA标签 if(!name.equals("xml")){//代表当前处理节点是class,用XstreamAlias把class的别名改成xml,下面的代码片段有提到 cdata = needCDATA(targetClass, name); }else{ targetClass = clazz; } } @Override protected void writeText(QuickWriter writer, String text) { if (cdata) { writer.write(cDATA(text)); } else { writer.write(text); } } }; } }); }
private static boolean needCDATA(Class<?> targetClass, String fieldAlias){ boolean cdata = false; //first, scan self cdata = existsCDATA(targetClass, fieldAlias); if(cdata) return cdata; //if cdata is false, scan supperClass until java.lang.Object Class<?> superClass = targetClass.getSuperclass(); while(!superClass.equals(Object.class)){ cdata = existsCDATA(superClass, fieldAlias); if(cdata) return cdata; superClass = superClass.getClass().getSuperclass(); } return false; }
private static boolean existsCDATA(Class<?> clazz, String fieldAlias){ //scan fields Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { //1. exists XStreamCDATA if(field.getAnnotation(XStreamCDATA.class) != null ){ XStreamAlias xStreamAlias = field.getAnnotation(XStreamAlias.class); //2. exists XStreamAlias if(null != xStreamAlias){ if(fieldAlias.equals(xStreamAlias.value()))//matched return true; }else{// not exists XStreamAlias if(fieldAlias.equals(field.getName())) return true; } } } return false; }
用上面的方式初始化xstream,在需要加入CDATA标签的field加入注解,代码如下:
@XStreamAlias("xml") public class WeiXinMessage implements Message { /** ToUserName */ @XStreamAlias("ToUserName") @XStreamCDATA protected String toUserName; /** FromUserName */ @XStreamAlias("FromUserName") @XStreamCDATA protected String fromUserName; /** CreateTime */ @XStreamAlias("CreateTime") protected long createTime; /** MsgType */ @XStreamAlias("MsgType") @XStreamCDATA protected String msgType;
对于上面的Java Bean在转成XML的时候,ToUserName,FromUserName,MsgType这3个field会打上CDATA标签,以下是测试代码:
XStream xStream = WXXStreamHelper.createXstream(); xStream.processAnnotations(WeiXinMessage.class); WeiXinMessage msgObj = ...//构造一个WeiXinMessage对象 String xml = xStream.toXML(msgObj);
【版权申明】
本文出自ITEYE BLOG,转载请注明出处:http://qurey.iteye.com/blog/1935897
相关推荐
NULL 博文链接:https://zzc1684.iteye.com/blog/2209510
xstream方式解析及生成xml文件
多个类注解@XStreamAlias,value相同、且在集合上使用了@XStreamImplicit会出现异常: com.thoughtworks.xstream.converters.ConversionException: No field 'null' found in class '.....(注解的类路径)' ---- ...
Xstream生产xml和解析xml
用Xstream生成和解析xml
里面有位前辈的代码,是从外部读取xml的
webService接口对接时,需要传递一个xml内容。用xStream拼接xml
Xstream_java对象和xml的互相转换
一个小demo展示xml的两种解析方式和四种解析方法,以及使用XStream进行javaBean与xml、json之间的转换
XStream和Xpp3实现对象到XML的互转参考文档 本人的一次真实测试,有效实用,对一些异常处理也做了解释。对于所需的jar包,本人会另外上传。
xstream-1.4.9实现xml与对象互转,不会用可以找dddddddddddddddddd
XStream组件进行Object与XML互转用法 1.所需求jar包: xstream-1.3.1.jar 2.如果仅进行OBJECT与XML之间互转只需要这一个jar 包及XStream这一个类就可又了 用法说明: 1.OBJECT 转XML //第一步:准备好要进行XML...
这个是 对于要把数据库获得的 list 转换成 xml 有了XStream在Java对象和XML之间相互转换 就变得非常容易了 嘿嘿
使用xstream进行java类与xml文件互转解析
java 利用Xstream注解生成和解析xml 非常好用 非常好用
xStream xml to bean,使用xStream 互转 xml 、bean. 的一个工具类。
xStream完美转换XML、JSON,包括XML转换成对象,以及对象转换成XML,以及对象转换成JSON,以及注意事项
XStream在运行时使用Java反射机制对要进行序列化的...XStream支持以方法调用的方式,或是Java 标注的方式指定别名。 XStream在进行数据类型转换时,使用系统缺省的类型转换器。同时,也支持用户自定义的类型转换器。
Java对象转换成XML字符串 将List集合转换成xml文档 Map集合转换xml文档 用InputStream将XML文档转换成java对象