在腾讯微信开发中,用XStream把java对象转成xml格式的文件,为满足腾讯微博的xml格式对XStream 做了一些扩展
使其支持CDATA,数字和浮点数不加CDATA,xml属性首字母大写
/**
* 扩展xstream,使其支持CDATA块*/
private static XStream xstream = new XStream(new XppDriver() {
public HierarchicalStreamWriter createWriter(Writer out) {
return new PrettyPrintWriter(out) {
// 对那些xml节点的转换增加CDATA标记 true增加 false反之
boolean cdata = false;
@SuppressWarnings("unchecked")
public void startNode(String name, Class clazz) {
if(!name.equals("xml")){
char[] arr = name.toCharArray();
if (arr[0] >= 'a' && arr[0] <= 'z') {
//arr[0] -= 'a' - 'A';
//ASCII码,大写字母和小写字符之间数值上差32
arr[0] = (char) ((int) arr[0] - 32);
}
name = new String(arr);
}
super.startNode(name, clazz);
}
@Override
public void setValue(String text) {
if(text!=null && !"".equals(text)){
//浮点型判断
Pattern patternInt = Pattern.compile("[0-9]*(\\.?)[0-9]*");
//整型判断
Pattern patternFloat = Pattern.compile("[0-9]+");
//如果是整数或浮点数 就不要加[CDATA[]了
if(patternInt.matcher(text).matches() || patternFloat.matcher(text).matches()){
cdata = false;
}else{
cdata = true;
}
}
super.setValue(text);
}
protected void writeText(QuickWriter writer, String text) {
/* if (cdata) {
text = "<![CDATA["+text+"]]>";
}
super.writeText(writer, text);*/
if (cdata) {
writer.write("<![CDATA[");
writer.write(text);
writer.write("]]>");
} else {
writer.write(text);
}
}
};
}
});
/**
* 文本消息对象转换成xml
*
* @param textMessage 文本消息对象
* @return xml
*/
public static String textMessageToXml(TextMessage textMessage) {
xstream.alias("xml", textMessage.getClass());
return xstream.toXML(textMessage);
}
测试
public void testTextMessageToXml(){
TextMessage textMessage =new TextMessage();
textMessage.setToUserName("toUserName");
textMessage.setFromUserName("fromUserName");
textMessage.setContent("我的测试");
textMessage.setCreateTime(1348831860);
textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
textMessage.setFuncFlag(0);
String xml = MessageUtil.textMessageToXml(textMessage);
System.out.println(xml);
}
结果:
<xml>
<ToUserName><![CDATA[toUserName]]></ToUserName>
<FromUserName><![CDATA[fromUserName]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<FuncFlag>0</FuncFlag>
<Content><![CDATA[我的测试]]></Content>
</xml>