XStream是个很方便很好用的java BeanToXml;XmlToBean的开源工具,虽然它也有一些不太方便的地方,如转换xml时在xml文本节点追加CDATA时,比较麻烦。
目前根据网上搜索的解决方法,以及我自己摸索后,可以使用以下方法来解决:
1.首先实现XStream的Converter接口
请注意:
这里是判断那些java类型的字段需要进行转换,这里因为要加入CDATA,我们以String类型作为要进行转换的字段来匹配。
至于加入CDATA标签就简单了:
就是个字符串拼接,在object这个我们需要加入CDATA标签的字段的值,前后加入CDATA标签元素即可。
2.在需要转换的JavaBean字段上加入注解@XStreamConverter
其中CDATAConvert.class就是我们自己实现的XStream转换器,是不是很简单
3. 使用XStream提供的方法将JavaBean转换成xml格式字符串
使用JUnit测试
我们来看输出:
咿!"<!"这是什么鬼?这跟平常的CDATA标签怎么不一样啊,其实这是XStream将"<"、">"等符号做了转义,那么不转义不就好了么,就差最后一步了,不可能功亏一篑啊
其实我们可以使用apache提供的commons-lang.***.jar下面的StringEscapeUtils类来做处理
加上
加入最后2行代码,我们再来试试看:
OK!这不就好了么!其实开发中会遇到大大小小的坑,只要我们多开脑洞就一定会解决的。
目前根据网上搜索的解决方法,以及我自己摸索后,可以使用以下方法来解决:
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!这不就好了么!其实开发中会遇到大大小小的坑,只要我们多开脑洞就一定会解决的。