扩展xstream,使其支持CDATA块

来源:互联网 发布:安卓 ping软件 编辑:程序博客网 时间:2024/05/16 20:30

在腾讯微信开发中,用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>

原创粉丝点击