xiangzi_camel

导航

.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;
}


3. JavaScript与C#中的方式基本相同,这里就不做过多描述。

附:book.xml

book.xml

posted on 2006-03-20 21:28  xiangzi  阅读(1234)  评论(3编辑  收藏  举报