.net+xml 搜索时大小写敏感的问题
最近对ajax有些兴趣,于是便在自己的log上加了对xml的搜索功能,作为ajax实现的一个实验品。
ajax技术倒是没遇上问题,搜索xml时却发现,各类语言对大小写敏感成为我很大的障碍:
1. xml全文都是大小写敏感的,包括节点名/属性/节点值,因此使用xpath进行搜索时,只能够精确匹配。这明显不符合要求;
2. C#中大小写敏感,因此想给搜索结果中的关键字高亮显示无法直接实现;
3. JavaScript中也是大小写敏感,前台实现高亮显示关键字的也宣告失败。
解决方式:
1. XPath 2.0 中增加了字符串处理函数 upper-case 和 lower-case(XPath 2.0 简介),可以直接转换节点值后进行查找,但目前尚未推出支持它的xml版本,因此,我们只好另寻出路。好在XPath 1.0 中有translate函数可以使用(book.xml 见附件):
private void XmlSearch(string strKeyWords)
2. 查找到目标节点后,还需要将返回内容中的关键字进行高亮显示,这时就要用正则表达式来完成了:
(为避免重复替换这里使用MatchEvaluator)
private string Highlight(string strContent, string strKeyWords)
{
string strPattern = string.Empty;
char[] charKeyWords = strKeyWords.ToCharArray();
for (int intI=0; intI<charKeyWords.Length; intI++)
{
int intFirstChar = Convert.ToInt32(charKeyWords[intI]);
string strFirstChar = charKeyWords[intI].ToString();
if (this.IsLetter(intFirstChar))
strPattern += "(" + strFirstChar.ToLower() + "|" + strFirstChar.ToUpper() + ")";
else
strPattern += strFirstChar;
}
Regex re = new Regex(strPattern);
MatchEvaluator myEvaluator = new MatchEvaluator(ReplaceRegex);
return re.Replace(strContent, myEvaluator);
}
private static string ReplaceRegex(Match m)
{
return "<span class='highlight'>" + m.Value + "</span>";
}
private bool IsLetter(int intCharCode)
{
if ((intCharCode >= 65 && intCharCode <= 90) || (intCharCode >= 97 && intCharCode <= 122))
return true;
else
return false;
}
{
string strPattern = string.Empty;
char[] charKeyWords = strKeyWords.ToCharArray();
for (int intI=0; intI<charKeyWords.Length; intI++)
{
int intFirstChar = Convert.ToInt32(charKeyWords[intI]);
string strFirstChar = charKeyWords[intI].ToString();
if (this.IsLetter(intFirstChar))
strPattern += "(" + strFirstChar.ToLower() + "|" + strFirstChar.ToUpper() + ")";
else
strPattern += strFirstChar;
}
Regex re = new Regex(strPattern);
MatchEvaluator myEvaluator = new MatchEvaluator(ReplaceRegex);
return re.Replace(strContent, myEvaluator);
}
private static string ReplaceRegex(Match m)
{
return "<span class='highlight'>" + m.Value + "</span>";
}
private bool IsLetter(int intCharCode)
{
if ((intCharCode >= 65 && intCharCode <= 90) || (intCharCode >= 97 && intCharCode <= 122))
return true;
else
return false;
}
3. JavaScript与C#中的方式基本相同,这里就不做过多描述。
附:book.xml
book.xml