`
cjm0000000
  • 浏览: 32784 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

XStream注解方式实现生成的XML带CDATA标签

阅读更多

最近在实现微信公众接口的时候,用到了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

2
0
分享到:
评论
5 楼 转转beta 2014-11-04  
这种方式有一个缺陷,就是如果类里有参数是List<Model>的形式,那么Model里的字段并不能正确的使用注解
4 楼 zhangjjie 2014-08-21  
内部类有问题,CDATA标签注解加了没用
3 楼 weixinjie 2014-05-21  
@cjm0000000 谢谢提供。
不过程序当中有个bug,needCDATA方法的while循环
      while(!superClass.equals(Object.class)){  
            cdata = existsCDATA(superClass, fieldAlias);  
            if(cdata) return cdata;  
            [color=red]superClass = superClass.getClass().getSuperclass();[/color]  
        }  

这里传值targetClass是class的一个实例,superClass.getClass().getSuperclass()得到的是Object,为Class类的父类。
正确的写法应该是
superClass = superClass.getSuperclass();

不然继承深度三级以上会出现问题。
2 楼 cjm0000000 2014-01-14  
jurnzhou 写道
大哥,第二段代码是新建一个类吗?

是新建一个XStream实例。
1 楼 jurnzhou 2014-01-10  
大哥,第二段代码是新建一个类吗?

相关推荐

    java 利用Xstream注解生成和解析xml

    Xstream通过使用注解提供了高度的灵活性,使得XML的生成和解析更加简单和直观。在这篇文章中,我们将深入探讨如何利用Xstream的注解来处理XML。 首先,要使用Xstream,我们需要在项目中引入其依赖。如果你使用的是...

    使用XStream 多集合生成xml

    在Java开发中,数据序列化和反序列化是常见的...通过XStream提供的API,你可以灵活地控制XML的生成方式,满足各种序列化需求。在实际应用中,确保对XStream的配置和使用有深入理解,能有效提高代码的可读性和维护性。

    JAVA对象转换成XML(CDATA)

    要将Java对象转换成XML并包含CDATA,我们可以利用如XStream这样的库。XStream是一个简单且功能强大的库,用于将Java对象转换为XML,反之亦然。在上述例子中,我们看到了一个自定义的实现过程,包括三个主要类:...

    Xstream生产xml和解析xml

    Xstream是一款强大的Java库,用于实现Java对象与XML文档之间的转换。这种转换不仅支持基本数据类型,也适用于复杂的数据结构,包括自定义类和集合。Xstream的设计旨在简化序列化过程,使得开发者能够轻松地在Java...

    xml解析及使用XStream实现javaBean与xml之间的转换

    本篇将详细讲解XML的解析方式及其在Java中的应用,特别是如何使用XStream库进行JavaBean与XML之间的互转。 1. **XML解析方式** - DOM解析:Document Object Model,它一次性加载整个XML文档到内存,形成一棵树形...

    Xstream生成和解析xml.rar

    本篇文章将详细介绍如何利用Xstream进行XML的生成和解析。 **一、Xstream简介** Xstream是Java社区中的一款开源库,由Johannes Link创建,它的设计目标是使XML序列化和反序列化变得简单直观。Xstream的核心理念是...

    com.thoughtworks.xstream.XStream操作XML和java对象的一些用法

    XStream库提供了一个简单、直观的方式来实现这种转换,使得XML序列化和反序列化变得非常方便。本篇将详细介绍XStream如何处理XML与Java对象的相互转换,以及如何处理List、Map等集合类型的数据。 首先,XStream是一...

    Java用xStream拼接xml

    Java中的xStream库提供了一个简单易用的方式来将Java对象序列化为XML,反之亦然,即反序列化XML回Java对象。 **xStream简介** xStream是一个开源的Java库,由Johannes Link创建。它提供了简洁、直观的API来处理XML...

    xstream方式解析xml文件

    xstream方式解析及生成xml文件

    解决XStream注解同名冲突

    多个类注解@XStreamAlias,value相同、且在集合上使用了@XStreamImplicit会出现异常: com.thoughtworks.xstream.converters.ConversionException: No field 'null' found in class '.....(注解的类路径)' ---- ...

    Xstream_java对象和xml的互相转换

    XStream 的设计目标是提供一种简单且直观的方式来处理 XML 和 Java 之间的映射,而不需要编写大量的代码或配置。 XStream 的核心概念是通过自动映射 Java 类和 XML 节点来实现对象和 XML 的转换。它通过反射和...

    XStream和Xpp3实现对象到XML的互转参考文档

    XStream和Xpp3是两个常用的库,用于实现Java对象与XML之间的转换。本文档将详细介绍如何使用XStream和Xpp3进行对象到XML的转换,并解决可能出现的问题。 首先,要使用XStream和Xpp3,你需要引入相应的库文件。在本...

    使用XStream是实现XML与Java对象的转换(3)--注解

    在“xstream使用3”这个压缩包文件中,可能包含了使用XStream注解实现XML与Java对象转换的示例代码、测试用例以及相关的说明文档。通过对这些文件的深入学习,开发者可以更好地理解如何在实际项目中运用XStream的...

    使用xstream进行java类与xml文件互转解析--代码

    总的来说,XStream提供了一种简洁、直观的方式来处理Java对象与XML之间的转换。它的强大之处在于可以自动处理复杂的对象结构,并且允许开发者自定义XML的表示方式。通过熟练掌握XStream,可以极大地提高Java项目中...

    xStream xml to bean

    xStream是一个轻量级的库,它提供了一种简单的方式来将Java对象序列化为XML,反之亦然。这个工具类的目标就是利用xStream的功能,方便地将XML文档转换为Java Bean对象,以及将Bean对象转换为XML字符串。 xStream的...

    springMVC整合xStream实现对象和xml转换

    XStream提供了一种简单而直观的方式来处理XML和Java对象之间的转换。通过使用注解或自定义转换器,我们可以控制XML的结构和Java对象的映射关系。XStream的优点在于它能自动处理基本数据类型、集合和自定义类的转换,...

    XStream解析XML实例

    在Java开发中,处理XML数据是一项常见的任务,XStream库提供了一个简单而强大的方式来将Java对象序列化为XML,以及从XML反序列化回Java对象。这个实例将深入探讨如何使用XStream进行XML操作。 **1. XStream简介** ...

    xstream-1.4.9实现xml与对象互转

    XStream 提供了一种简单而直观的方式来处理 XML 和 Java 对象之间的转换。通过使用 XStream 1.4.9,开发人员可以在项目中轻松地进行数据序列化和反序列化,便于数据存储和交换。尽管如此,使用时应注意安全问题,...

    使用xstream实现对JavaBean与xml字符串的互转

    这篇博客将探讨如何使用XStream库实现JavaBean到XML字符串以及XML字符串回转到JavaBean的过程。 首先,让我们了解XStream的基本概念。XStream由Johannes Brodskiy创建,它是一个基于Java的库,提供了简单且高性能的...

Global site tag (gtag.js) - Google Analytics