java使用XStream转换时,添加CDATA元素

XStream是个很方便很好用的java BeanToXml;XmlToBean的开源工具,虽然它也有一些不太方便的地方,如转换xml时在xml文本节点追加CDATA时,比较麻烦。
目前根据网上搜索的解决方法,以及我自己摸索后,可以使用以下方法来解决:
1.首先实现XStream的Converter接口

/**
* 处理JAVA对象转换成XML时添加<!CDATA[ ]]>标签
* @author kongxiaoqian
* @version 1.0
*/
public class CDATAConvert implements Converter {

/**
* java对象转换为xml
*/
public void marshal(Object object, HierarchicalStreamWriter writer,
MarshallingContext context) {

String prefix = "<![CDATA[";
String suffix = "]]>";
String trans = prefix + object + suffix;
writer.setValue(trans);
}

/**
* xml转换成JAVA对象
*/
public Object unmarshal(HierarchicalStreamReader reader,
UnmarshallingContext context) {

return reader.getValue();
}

/**
* 判断字段是否是需要转换的类型
*/
public boolean canConvert(Class paramClass) {
return String.class.isAssignableFrom(paramClass);
}

}

请注意:

/**
* 判断字段是否是需要转换的类型
*/
public boolean canConvert(Class paramClass) {
return String.class.isAssignableFrom(paramClass);
}

这里是判断那些java类型的字段需要进行转换,这里因为要加入CDATA,我们以String类型作为要进行转换的字段来匹配。
至于加入CDATA标签就简单了:

/**
* java对象转换为xml
*/
public void marshal(Object object, HierarchicalStreamWriter writer,
MarshallingContext context) {

String prefix = "<![CDATA[";
String suffix = "]]>";
String trans = prefix + object + suffix;
writer.setValue(trans);
}

就是个字符串拼接,在object这个我们需要加入CDATA标签的字段的值,前后加入CDATA标签元素即可。
2.在需要转换的JavaBean字段上加入注解@XStreamConverter

@XStreamAlias("xml")
public class TextRespMsg extends BaseRespMsg {

@XStreamConverter(CDATAConvert.class)
private String Content;

public String getContent() {
return Content;
}

public void setContent(String content) {
Content = content;
}
}

其中CDATAConvert.class就是我们自己实现的XStream转换器,是不是很简单
3. 使用XStream提供的方法将JavaBean转换成xml格式字符串
使用JUnit测试

...
TextRespMsg txtMsg = new TextRespMsg();
txtMsg.setToUserName("oMgHVjngRipVsoxg6TuX3vz6glDg");
txtMsg.setFromUserName("gh_e136c6e50636");
txtMsg.setCreateTime(12121212);
txtMsg.setMsgType("text");
txtMsg.setContent("哈哈哈哈0");

ParseBeanToXml beanToXml = ParseBeanToXml.getInstance();
String responseXml = beanToXml.beanToXml(new XStream(), txtMsg, TextRespMsg.class);
System.out.println("############# XStream Bean转换成Xml 增加CDATA标签");
System.out.println(responseXml);
...

我们来看输出:

############# XStream Bean转换成Xml 增加CDATA标签
<xml>
<ToUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></ToUserName>
<FromUserName><![CDATA[gh_e136c6e50636]]></FromUserName>
<CreateTime>12121212</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[哈哈哈哈0]]></Content>
</xml>

咿!"<!"这是什么鬼?这跟平常的CDATA标签怎么不一样啊,其实这是XStream将"<"、">"等符号做了转义,那么不转义不就好了么,就差最后一步了,不可能功亏一篑啊
其实我们可以使用apache提供的commons-lang.***.jar下面的StringEscapeUtils类来做处理
加上

TextRespMsg txtMsg = new TextRespMsg();
txtMsg.setToUserName("oMgHVjngRipVsoxg6TuX3vz6glDg");
txtMsg.setFromUserName("gh_e136c6e50636");
txtMsg.setCreateTime(12121212);
txtMsg.setMsgType("text");
txtMsg.setContent("哈哈哈哈0");

ParseBeanToXml beanToXml = ParseBeanToXml.getInstance();
String responseXml = beanToXml.beanToXml(new XStream(), txtMsg, TextRespMsg.class);
System.out.println("############# XStream Bean转换成Xml 增加CDATA标签");
System.out.println(responseXml);
System.out.println("############# XStream Bean转换成Xml 小问题需要使用将转义符转成原始符号");
String transXml = StringEscapeUtils.unescapeXml(responseXml);
System.out.println(transXml);

加入最后2行代码,我们再来试试看:

############# XStream Bean转换成Xml 增加CDATA标签
<xml>
<ToUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></ToUserName>
<FromUserName><![CDATA[gh_e136c6e50636]]></FromUserName>
<CreateTime>12121212</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[哈哈哈哈0]]></Content>
</xml>
############# XStream Bean转换成Xml 小问题需要使用将转义符转成原始符号
<xml>
<ToUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></ToUserName>
<FromUserName><![CDATA[gh_e136c6e50636]]></FromUserName>
<CreateTime>12121212</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[哈哈哈哈0]]></Content>
</xml>


OK!这不就好了么!其实开发中会遇到大大小小的坑,只要我们多开脑洞就一定会解决的。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值