xtream处理特殊字符的问题

来源:互联网 发布:什么软件搞笑拍照 编辑:程序博客网 时间:2024/06/02 19:28

需求:在生成XML文档中需要支持CDATA标签,而且不是所字段都需要增加,只需要某些特定的字段增加CDATA的标签。 

研究:在网上找了一些相关资料,基本采用的方法都是重载XppDriver,做一个MyXppDriver类对XppDriver进行扩展,MyXppDriver中的作用,就是将要生成的xml文件的text进行字符转义,最后使用XStream xstream = new XStream(new MyXppDriver)来创建XStream对象,最终支持CDATA标签。 

思考:首先本人认为这样写这个类比较麻烦,现在我需要修改部份重载让那些要输出的text中,如果有"<![CDATA["开始和"]]>"结束的字段就不用进行任何特殊符号的转义,而某字段没有CDATA标签的起讫符号时,就依然使用原有的PrettyPrintWriter 的writerText方法输出,即将text中的特殊符号进行转义,如:引号(")会被转义为"&quot",以此来确保输出的xml文件在读取时不会出错 


Java代码

 

  1. protected static String PREFIX_CDATA    = "<![CDATA[";   
  2. protected static String SUFFIX_CDATA    = "]]>";   
  3.   
  4.     /**  
  5.      * 初始化XStream  
  6.      * 可支持某一字段可以加入CDATA标签   
  7.      * 如果需要某一字段使用原文  
  8.      * 就需要在String类型的text的头加上"<![CDATA["和结尾处加上"]]>"标签,  
  9.      * 以供XStream输出时进行识别  
  10.      * @param isAddCDATA 是否支持CDATA标签   
  11.      * @return  
  12.      */  
  13.     public static XStream initXStream(boolean isAddCDATA){   
  14.         XStream xstream = null;   
  15.         if(isAddCDATA){   
  16.             xstream =  new XStream(   
  17.                new XppDriver() {   
  18.                   public HierarchicalStreamWriter createWriter(Writer out) {   
  19.                      return new PrettyPrintWriter(out) {   
  20.                      protected void writeText(QuickWriter writer, String text) {   
  21.                                       if(text.startsWith(PREFIX_CDATA)    
  22.                                          && text.endsWith(SUFFIX_CDATA)) {   
  23.                                           writer.write(text);   
  24.                                       }else{   
  25.                                           super.writeText(writer, text);   
  26.                                       }   
  27.                       }   
  28.                     };   
  29.                   };   
  30.                 }   
  31.             );   
  32.         }else{   
  33.             xstream = new XStream();   
  34.         }   
  35.      return xstream;   
  36.     
0 0