`

xml特殊字符转义技术

    博客分类:
  • java
阅读更多

在项目测试阶段,测试人员会输入一些特殊字符,比如:<table>、<./或<这样的字符时,页面就会出现错误, 如果是导出,导出的Excel也会出现问题,或者直接输出的页面会把用户输入的<、>、&及 都转化成<、>、&及空格,原因是用java代码直接取的并没有对特殊字符做转义。
     因为Html中的<, >,&有特殊含义,(前两个字符用于链接签,&用于转义),不能直接使用。使用这三个字符时,应使用它们的转义序列。

 

   & 的转义序列为 & amp 或 & #38;
   < 的转义序列为 & lt; & #60;
   > 的转义序列为 & gt; & #62;
  前者为字符转义序列,后者为数字转义序列。


  例如 & lt; font >显示为<font>,若直接写为则被认为是一个链接签。
  需要说明的是:
    a. 转义序列各字符间不能有空格;
    b. 转义序列必须以“;”结束;
    c. 单独的&不被认为是转义开始。
    d. 区分大小写  
     另一个需要转义的字符是双引号””,它的转义序列为"或"
     这里需要特殊注意的是一定要对&进行转义,有的朋友只对<、>甚至引号转义,但并没有对&进行转义,&是Html转义字符的开始,如果在XML文档中使用类似"<" 的字符, 那么解析器将会出现错误,因为解析器会认为这是一个新元素的开始。所以必须要对&进行转义。
解决方法是定义个工具类Tools。

     

      

Java代码  收藏代码
  1. /** 
  2.   * 替换一个字符串中的某些指定字符 
  3.   * @param strData String 原始字符串 
  4.   * @param regex String 要替换的字符串 
  5.   * @param replacement String 替代字符串 
  6.   * @return String 替换后的字符串 
  7.   */  
  8.  public static String replaceString(String strData, String regex,  
  9.          String replacement)  
  10.  {  
  11.      if (strData == null)  
  12.      {  
  13.          return null;  
  14.      }  
  15.      int index;  
  16.      index = strData.indexOf(regex);  
  17.      String strNew = "";  
  18.      if (index >= 0)  
  19.      {  
  20.          while (index >= 0)  
  21.          {  
  22.              strNew += strData.substring(0, index) + replacement;  
  23.              strData = strData.substring(index + regex.length());  
  24.              index = strData.indexOf(regex);  
  25.          }  
  26.          strNew += strData;  
  27.          return strNew;  
  28.      }  
  29.      return strData;  
  30.  }  
  31.   
  32.  /** 
  33.   * 替换字符串中特殊字符 
  34.   */  
  35. ublic static String encodeString(String strData)  
  36.  {  
  37.      if (strData == null)  
  38.      {  
  39.          return "";  
  40.      }  
  41.      strData = replaceString(strData, "&""&amp;");  
  42.      strData = replaceString(strData, "<""&lt;");  
  43.      strData = replaceString(strData, ">""&gt;");  
  44.      strData = replaceString(strData, "&apos;""&apos;");  
  45.      strData = replaceString(strData, "\"""&quot;");  
  46.      return strData;  
  47.  }  
  48.   
  49.  /** 
  50.   * 还原字符串中特殊字符 
  51.   */  
  52. public static String decodeString(String strData)  
  53.  {  
  54.      strData = replaceString(strData, "&lt;""<");  
  55.      strData = replaceString(strData, "&gt;"">");  
  56.      strData = replaceString(strData, "&apos;""&apos;");  
  57.      strData = replaceString(strData, "&quot;""\"");  
  58.      strData = replaceString(strData, "&amp;""&");  
  59.      return strData;  
  60.  }  

 

 

 

      第一个函数replaceString转义单个字符,第二个函数encodeString为转义包括&、<、>、’和\这几个特殊字符,第三个函数decodeString是还原这几个特殊字符。
因此在需要转义的时候调用Tools. encodeString()就可以了。


     需要说明的是导出Excel是比较特殊的,因为如果有<table>这样的内容,是Excel保留字的,会造成Excel表格的混乱,如果要是用这个工具类做转义的话,会出现显示出<table>这样的内容,它会认为这是个字符串,并且不太好再把这样的字符串转义过来,经过测试如果有像“<>& ”或其它的Html标签,Excel会认为这样的内容为字符串,并不会引起错误,所以我可以放心的认为只有<table>这样的内容才会引起错误。那么怎么才能解决这个问题呢,既然只有<和>才会引起错误,那么何不把半角的尖括号转成全角的尖括号呢,经过测试后,发现真的可以解决,而且是个很高明的方法,因此就这样找到了解决方案。


还有一点是,无论用户输入多少个连续的空格,在页面中显示都为一个空格,这是Html本身就有的,因为Html只认 为标准的空格,解决方案是把普通空格转义为 ,但涉及的范围之广,影响的地方之大,是我们必须要考虑的因素,不光是像Display Tag标签和自定义的标签,而且struts本身的标签也要进行修改,这样一来,工作量大不说,不知道会不会引起这样那样的问题,而且并不影响正常运行,所以经过再三考虑,还是决定不予修改。

 

分享到:
评论

相关推荐

    《javaScrip开发技术大全》源代码

    • sample02.htm 使用转义字符 • sample03.htm 数组直接量的使用方法 • sample04.htm 数组直接量 • sample05.htm 函数直接量的使用方法 • sample06.htm 对象直接量 第...

    PHP程序开发范例宝典III

    技术、报表与打印技术、网络通信技术、PHP与XML技术、安全技术、PHP高级应用技术以及综合应用等。《PHP程序开发范例宝典》共提供了453 个实例,每个实例都突出实用性,绝大部分实例都体现了PHP编程人员在实际项目...

    Web安全深度剖析(张柄帅)

    5.5.2 特殊字符转义 101 5.5.3 使用预编译语句 102 5.5.4 框架技术 103 5.5.5 存储过程 104 5.6 小结 105 第6章 上传漏洞 106 6.1 解析漏洞 106 6.1.1 IIS解析漏洞 106 6.1.2 Apache解析漏洞 109 6.1.3 PHP CGI解析...

    C#开发经验技巧宝典

    第15章 键盘与鼠标 389 15.1 鼠标操作技巧 390 0626 鼠标双击窗体时模拟键盘Tab键操作 390 0627 定义鼠标指针形状 390 0628 自定义鼠标的图片 391 ...0794 如何用@代替路径中的转义字符 482

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例043 使用转义字符输出特殊字符 74 实例044 使用常量指定PI的值计算圆的面积 75 2.2 运算符 75 实例045 自定义数字的加密/解密算法 76 实例046 比较两个时间戳的大小 77 实例047 使用条件运算符判断数字的奇偶性 ...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例043 使用转义字符输出特殊字符 74 实例044 使用常量指定PI的值计算圆的面积 75 2.2 运算符 75 实例045 自定义数字的加密/解密算法 76 实例046 比较两个时间戳的大小 77 实例047 使用条件运算符判断数字的奇偶性 ...

    php网络开发完全手册

    7.5.4 转义正则表达式字符——preg_ 7.5.4 quote 113 7.5.5 执行正则表达式的搜索和替换 7.5.5 函数——preg_replace 114 7.5.6 通过回调函数执行正则表达式 7.5.6 的搜索和替换——preg_replace_ 7.5.6 callback ...

    C#编程经验技巧宝典

    19 &lt;br&gt;0038 巧用“^=”运算符 19 &lt;br&gt;0039 巧用位移运算符 20 &lt;br&gt;0040 使用条件运算符 20 &lt;br&gt;0041 巧用分隔符 20 &lt;br&gt;0042 如何处理转义字符 21 &lt;br&gt;0043 “;”结束符问题 21 ...

    PHP和MySQL Web开发第4版pdf以及源码

    4.6.9 特殊字符一览 4.6.10 在智能表单中应用 4.7 用正则表达式查找子字符串 4.8 使用正则表达式分割字符串 4.9 比较字符串函数和正则表达式函数 4.10 进一步学习 4.11 下一章 第5章 代码重用与函数编写 ...

    PHP和MySQL Web开发第4版

    4.6.9 特殊字符一览 4.6.10 在智能表单中应用 4.7 用正则表达式查找子字符串 4.8 使用正则表达式分割字符串 4.9 比较字符串函数和正则表达式函数 4.10 进一步学习 4.11 下一章 第5章 代码重用与函数编写 ...

    PHP和MySQL WEB开发(第4版)

    4.6.8 匹配特殊字符 4.6.9 特殊字符一览 4.6.10 在智能表单中应用 4.7 用正则表达式查找子字符串 4.8 使用正则表达式分割字符串 4.9 比较字符串函数和正则表达式函数 4.10 进一步学习 4.11 下一章 第5章 代码重用与...

    易语言程序免安装版下载

    易语言5.1 相对于易语言5.0更新说明: ... 修改XML解析支持库,增加写出CDATA数据功能,解决解析XML时错误的丢弃换行和TAB字符的BUG,解决读取节点值时对CDATA数据进行转义处理的BUG。 20. 修改扩展界面支持库...

    最新Python3.5零基础+高级+完整项目(28周全)培训视频学习资料

    内置模块详解之Xml模块 内置模块详解之Configparser模块 内置模块详解之Hashlib、Hmac模块 正则表达式Re模块使用详解 第6周 本节小鸡汤(电影分享) 面向对象介绍 面向对象特性介绍 实例演示opp编程好处 实例变量...

Global site tag (gtag.js) - Google Analytics