博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
xml转义技术
阅读量:5345 次
发布时间:2019-06-15

本文共 3207 字,大约阅读时间需要 10 分钟。

     在项目测试阶段,测试人员会输入一些特殊字符,比如:<table>、<./或<这样的字符时,页面就会出现错误, 如果是导出,导出的Excel也会出现问题,或者直接输出的页面会把用户输入的<、>、&及 都转化成<、>、&及空格,原因是用java代码直接取的并没有对特殊字符做转义。

     因为Html中的<, >,&有特殊含义,(前两个字符用于链接签,&用于转义),不能直接使用。使用这三个字符时,应使用它们的转义序列。

   & 的转义序列为 & amp 或 & #38;

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

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:   public static String encodeString(String strData)
36:     {
37:         if (strData == null)
38:         {
39:             return "";
40:         }
41:         strData = replaceString(strData, "&", "&");
42:         strData = replaceString(strData, "<", "<");
43:         strData = replaceString(strData, ">", ">");
44:         strData = replaceString(strData, "'", "'");
45:         strData = replaceString(strData, "\"", """);
46:         return strData;
47:     }
48: 
49:     /**
50:      * 还原字符串中特殊字符
51:      */
52:    public static String decodeString(String strData)
53:     {
54:         strData = replaceString(strData, "<", "<");
55:         strData = replaceString(strData, ">", ">");
56:         strData = replaceString(strData, "'", "'");
57:         strData = replaceString(strData, """, "\"");
58:         strData = replaceString(strData, "&", "&");
59:         return strData;
60:     }

      第一个函数replaceString转义单个字符,第二个函数encodeString为转义包括&、<、>、’和\这几个特殊字符,第三个函数decodeString是还原这几个特殊字符。

因此在需要转义的时候调用Tools. encodeString()就可以了。
     需要说明的是导出Excel是比较特殊的,因为如果有<table>这样的内容,是Excel保留字的,会造成Excel表格的混乱,如果要是用这个工具类做转义的话,会出现显示出<table>这样的内容,它会认为这是个字符串,并且不太好再把这样的字符串转义过来,经过测试如果有像“<>& ”或其它的Html标签,Excel会认为这样的内容为字符串,并不会引起错误,所以我可以放心的认为只有<table>这样的内容才会引起错误。那么怎么才能解决这个问题呢,既然只有<和>才会引起错误,那么何不把半角的尖括号转成全角的尖括号呢,经过测试后,发现真的可以解决,而且是个很高明的方法,因此就这样找到了解决方案。
还有一点是,无论用户输入多少个连续的空格,在页面中显示都为一个空格,这是Html本身就有的,因为Html只认 为标准的空格,解决方案是把普通空格转义为 ,但涉及的范围之广,影响的地方之大,是我们必须要考虑的因素,不光是像Display Tag标签和自定义的标签,而且struts本身的标签也要进行修改,这样一来,工作量大不说,不知道会不会引起这样那样的问题,而且并不影响正常运行,所以经过再三考虑,还是决定不予修改。

转载于:https://www.cnblogs.com/long_/archive/2011/05/03/2035613.html

你可能感兴趣的文章
认证和授权(Authentication和Authorization)
查看>>
Mac上安装Tomcat
查看>>
CSS3中box-sizing的理解
查看>>
传统企业-全渠道营销解决方案-1
查看>>
Lucene全文检索
查看>>
awk工具-解析1
查看>>
推荐一款可以直接下载浏览器sources资源的Chrome插件
查看>>
CRM product UI里assignment block的显示隐藏逻辑
查看>>
AMH V4.5 – 基于AMH4.2的第三方开发版
查看>>
Web.Config文件配置之配置Session变量的生命周期
查看>>
mysql导入source注意点
查看>>
linux下编译安装nginx
查看>>
ArcScene 高程不同的表面无法叠加
查看>>
[ONTAK2010] Peaks
查看>>
DLL 导出函数
查看>>
windows超过最大连接数解决命令
查看>>
12个大调都是什么
查看>>
angular、jquery、vue 的区别与联系
查看>>
参数范围的选择
查看>>
使用 MarkDown & DocFX 升级 Rafy 帮助文档
查看>>