« | August 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | | | | | |
| 公告 |
戒除浮躁,读好书,交益友 |
Blog信息 |
blog名称:邢红瑞的blog 日志总数:523 评论数量:1142 留言数量:0 访问次数:9692734 建立时间:2004年12月20日 |

| |
[java语言]xpath的引号的转义  原创空间, 软件技术, 电脑与网络
邢红瑞 发表于 2007/7/21 10:12:23 |
由于设计时too simple的原因,没有考虑到xpath中出现引号的问题,例如 /*/app[name='na'me'],这样xpath就会有问题,有人提议使用双引号,/*/app[name="na'me"],就不会出问题,可是用户同时输入"和',不就死定了,看了看w3c的xpath的1.0规范,确实没有对引号,提出转义。惨,但是一想,这个规范是几家大公司共同制定的,不会犯这样大的错误,估计有别的办法。看了看xpath的函数,原来可以这末做。使用concat函数,java的代码如下public static String dealEscapeQuotes(String xpath) { StringBuffer sb = new StringBuffer(); if (xpath.indexOf('\'') != -1) { StringTokenizer st = new StringTokenizer(xpath, "'\"", true); sb.append("concat("); while (st.hasMoreTokens()) { String token = st.nextToken(); if (token.equalsIgnoreCase("'")) { sb.append("\""); sb.append(token); sb.append("\""); } else { sb.append("'"); sb.append(token); sb.append("'"); } if (st.countTokens() != 0) sb.append(","); } sb.append(")"); } else { sb.append("'"); sb.append(xpath); sb.append("'"); } return sb.toString(); }遇到’时,‘单引号外加双引号,遇到双引号,两边加单引号,其他的不变。如果字符串没有单引号,外面就用单引号处理。c#源码//you may want to use constants like HtmlTextWriter.SingleQuoteChar and//HtmlTextWriter.DoubleQuoteChar intead of strings like "'" and "\""private static string GenerateConcatForXPath(string a_xPathQueryString){ string returnString = string.Empty; string searchString = a_xPathQueryString; char[] quoteChars = new char[] { '\'', '"' }; int quotePos = searchString.IndexOfAny(quoteChars); if (quotePos == -1) { returnString = "'" + searchString + "'"; } else { returnString = "concat("; while (quotePos != -1) { string subString = searchString.Substring(0, quotePos); returnString += "'" + subString + "', "; if (searchString.Substring(quotePos, 1) == "'") { returnString += "\"'\", "; } else { //must be a double quote returnString += "'\"', "; } searchString = searchString.Substring(quotePos + 1, searchString.Length - quotePos - 1); quotePos = searchString.IndexOfAny(quoteChars); } returnString += "'" + searchString + "')"; } return returnString;} |
|
|