最近在实现微信公众接口的时候,用到了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
相关推荐
Xstream通过使用注解提供了高度的灵活性,使得XML的生成和解析更加简单和直观。在这篇文章中,我们将深入探讨如何利用Xstream的注解来处理XML。 首先,要使用Xstream,我们需要在项目中引入其依赖。如果你使用的是...
在Java开发中,数据序列化和反序列化是常见的...通过XStream提供的API,你可以灵活地控制XML的生成方式,满足各种序列化需求。在实际应用中,确保对XStream的配置和使用有深入理解,能有效提高代码的可读性和维护性。
要将Java对象转换成XML并包含CDATA,我们可以利用如XStream这样的库。XStream是一个简单且功能强大的库,用于将Java对象转换为XML,反之亦然。在上述例子中,我们看到了一个自定义的实现过程,包括三个主要类:...
Xstream是一款强大的Java库,用于实现Java对象与XML文档之间的转换。这种转换不仅支持基本数据类型,也适用于复杂的数据结构,包括自定义类和集合。Xstream的设计旨在简化序列化过程,使得开发者能够轻松地在Java...
本篇将详细讲解XML的解析方式及其在Java中的应用,特别是如何使用XStream库进行JavaBean与XML之间的互转。 1. **XML解析方式** - DOM解析:Document Object Model,它一次性加载整个XML文档到内存,形成一棵树形...
本篇文章将详细介绍如何利用Xstream进行XML的生成和解析。 **一、Xstream简介** Xstream是Java社区中的一款开源库,由Johannes Link创建,它的设计目标是使XML序列化和反序列化变得简单直观。Xstream的核心理念是...
XStream库提供了一个简单、直观的方式来实现这种转换,使得XML序列化和反序列化变得非常方便。本篇将详细介绍XStream如何处理XML与Java对象的相互转换,以及如何处理List、Map等集合类型的数据。 首先,XStream是一...
Java中的xStream库提供了一个简单易用的方式来将Java对象序列化为XML,反之亦然,即反序列化XML回Java对象。 **xStream简介** xStream是一个开源的Java库,由Johannes Link创建。它提供了简洁、直观的API来处理XML...
xstream方式解析及生成xml文件
多个类注解@XStreamAlias,value相同、且在集合上使用了@XStreamImplicit会出现异常: com.thoughtworks.xstream.converters.ConversionException: No field 'null' found in class '.....(注解的类路径)' ---- ...
XStream 的设计目标是提供一种简单且直观的方式来处理 XML 和 Java 之间的映射,而不需要编写大量的代码或配置。 XStream 的核心概念是通过自动映射 Java 类和 XML 节点来实现对象和 XML 的转换。它通过反射和...
XStream和Xpp3是两个常用的库,用于实现Java对象与XML之间的转换。本文档将详细介绍如何使用XStream和Xpp3进行对象到XML的转换,并解决可能出现的问题。 首先,要使用XStream和Xpp3,你需要引入相应的库文件。在本...
在“xstream使用3”这个压缩包文件中,可能包含了使用XStream注解实现XML与Java对象转换的示例代码、测试用例以及相关的说明文档。通过对这些文件的深入学习,开发者可以更好地理解如何在实际项目中运用XStream的...
总的来说,XStream提供了一种简洁、直观的方式来处理Java对象与XML之间的转换。它的强大之处在于可以自动处理复杂的对象结构,并且允许开发者自定义XML的表示方式。通过熟练掌握XStream,可以极大地提高Java项目中...
xStream是一个轻量级的库,它提供了一种简单的方式来将Java对象序列化为XML,反之亦然。这个工具类的目标就是利用xStream的功能,方便地将XML文档转换为Java Bean对象,以及将Bean对象转换为XML字符串。 xStream的...
XStream提供了一种简单而直观的方式来处理XML和Java对象之间的转换。通过使用注解或自定义转换器,我们可以控制XML的结构和Java对象的映射关系。XStream的优点在于它能自动处理基本数据类型、集合和自定义类的转换,...
在Java开发中,处理XML数据是一项常见的任务,XStream库提供了一个简单而强大的方式来将Java对象序列化为XML,以及从XML反序列化回Java对象。这个实例将深入探讨如何使用XStream进行XML操作。 **1. XStream简介** ...
XStream 提供了一种简单而直观的方式来处理 XML 和 Java 对象之间的转换。通过使用 XStream 1.4.9,开发人员可以在项目中轻松地进行数据序列化和反序列化,便于数据存储和交换。尽管如此,使用时应注意安全问题,...
这篇博客将探讨如何使用XStream库实现JavaBean到XML字符串以及XML字符串回转到JavaBean的过程。 首先,让我们了解XStream的基本概念。XStream由Johannes Brodskiy创建,它是一个基于Java的库,提供了简单且高性能的...