首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

13.3  SearchQuery类和Isearch类

SearchQuery和Isearch是和专用搜索类密切相关的两个基础类。其中Isearch是专用搜索类的基类,SearchQuery是给专用搜索类传递参数的工具类。下面逐一对它们进行介绍。

13.3.1  搜索字符处理类SearchQuery

本系统中查询字符串的参数传递意义重大。客户端页面需要向服务器传递参数,如查询的关键字、使用的搜索引擎等;服务器同时也要向搜索引擎提交查询参数,以获取查询结果。本章中以“nav_go_post”为名存储与搜索引擎相关的参数,这个参数值采用Base64编码形式。SearchQuery就是主要用来处理“nav_go_post”查询变量的类。“nav_go_post”变量是一个“键值对”的形式,是参数传递的中介体。SearchQuery类的具体代码如下。

//SearchQuery类的代码

using System;

using System.Collections;

using System.Collections.Generic;

using System.Text;

using System.Data;

using System.Text.RegularExpressions;

using System.Xml;

using System.Xml.XPath;

using System.Web;

using System.Xml.Xsl;

using System.IO;

//聚合搜索查询字符串的处理类

public class SearchQuery

{

     Dictionary<string, string> list = new Dictionary<string, string>();                                                     //查询字符串的名值对的集合

     public SearchQuery()

     {

          //搜索的特定查询字符串

          string post = HttpContext.Current.Server.UrlDecode(HttpContext.Current.
               Request["nav_go_post"]);

          if (post != null)                    //分析这个字符串,添加到名值对集合中

          {

                post = post.Replace(" ", "+");

                string list_ = Tools.Base64To(post);

                string[] zs = list_.Split('&');

                string name = "";                //定义名变量

                string value = "";               //定义值变量

                foreach (string str in zs)       //遍历添加数据

                {

                     name = Regex.Match(str, "[^=]+", RegexOptions.IgnoreCase).Value;

                     value = Regex.Match(str, "(?<==).+", RegexOptions.IgnoreCase).Value;

                     list[name] = value;

                }

          }

    }

    //把名值对集合转换成base64编码的字符串

    public string GetBase64()

    {

         IEnumerator<string> ie = list.Keys.GetEnumerator();

         List<string> ls = new List<string>();

         while (ie.MoveNext())             //遍历添加数据

         {

              string key = ie.Current;

              string value = list[key];

              ls.Add(string.Format("{0}={1}", key, value));

         }

         if (ls.Count > 0)                 //把名值对集合转换成base64编码的字符串

         {

              return Tools.ToBase64(string.Join("&", ls.ToArray()));

         }

         return "";

    }

    //获取指定名字的键值

    public string this[string name]

    {

         get

         {

                if (name != null && name != "")

                {

                      return list[name];

                }

                return null;

         }

    }

    // 添加一个名值对

    public void Add(string name, string value)

    {

         if (!list.ContainsKey(name))                  //不包含键值,则添加

         {

                 list.Add(name, value);

         }

         Else                                          //修改

         {

                 list[name] = value;

         }

    }

    //重写,将名值对集合转换成查询字符串形式

    public override string ToString()

    {

         IEnumerator<string> ie = list.Keys.GetEnumerator();

         List<string> ls = new List<string>();

         while (ie.MoveNext())                         //遍历名值对

         {

             string key = ie.Current;

             string value = list[key];

             ls.Add(string.Format("{0}={1}", key, value));

          }

          return string.Join("&", ls.ToArray());

    }

    //获得一个本类

    public static SearchQuery get_Nav()

    {

          return new SearchQuery();

    }

}

13.3.2  搜索基类Isearch

Isearch类是搜索专用类的基类。它定义了一个虚拟方法Search(),用来执行具体的搜索任务。各搜索专用类只需重写这个方法,实现自己的搜索逻辑即可。Isearch类的一个重要方法是GetPageString(),它用来获取搜索结果。其代码如下:

using System;

using System.Data;

using System.Configuration;

using System.Web;

using System.Net;

using System.IO;

using System.Text;

using System.Collections.Generic;

public abstract class ISearch

{

     string m_Url = "";                   //搜索的url(包含查询参数)

     public string URL

     {

          get

          {

                 return m_Url;

          }

          set

          {

                 m_Url = value;

          }

     }

     string m_itemtype;                   //搜索引擎的id,如google为9

     public string ItemType

     {

          get

          {

                 return m_itemtype;

          }

          set

          {

                 m_itemtype = value;

          }

     }

     string en = "";

     public string EnCode                //编码方式

     {

          get

          {

                return en;

          }

          set

          {

            en = value;

          }

     }

     protected string GetPageString()            //获取搜索结果的字符串表示

     {

          if (m_Url == null || m_Url == "" || !Tools.RegEx(@"^(\w+):\/\/[^\.]+
               [\.]\w+", m_Url))

          {

                return "";

          }

          string xmlstr = "";

          if (EnCode != "")

          {

                  //指定编码方式获取

                  xmlstr = Thief(m_Url, System.Text.Encoding.GetEncoding(en));

          }

          else

          {

                  xmlstr = Thief(m_Url);                 //默认编码方式获取

          }

          xmlstr = Tools.Replace(xmlstr, "[\x00-\x08]|[\x0B-\x0C]|[\x0E-\x1F]", "");

          xmlstr = Tools.delTagArray(xmlstr, "meta,title", true);

                                                    //删除meta、title

          return xmlstr;

     }

     //以指定编码方式获取某个页面内容

     private string Thief(string url, Encoding enc)

     {

           string tempurl = UrlEncode(url, enc);       //对url进行编码

           HttpWebRequest webr = (HttpWebRequest)WebRequest.Create(tempurl);

                                                    //创建请求

           HttpWebResponse wb = (HttpWebResponse)webr.GetResponse();

           Stream sr = wb.GetResponseStream();         //得到返回数据流

           StreamReader sr1 = new StreamReader(sr, enc);//用于读取数据流的内容

           string zz = sr1.ReadToEnd();                    //读取完成

           sr1.Close();

           wb.Close();                                 //关闭

           return zz;

     }

     //对url进行编码;url:请求的路径;enc:编码格式

     private static string UrlEncode(string url, Encoding enc)

     {

           byte[] bs = enc.GetBytes(url);              //得到字节表示的数组

           StringBuilder sb = new StringBuilder();     //用于返回结果

           for (int i = 0; i < bs.Length; i++)

           {

                 if (bs[i] < 128)                        //asc码在128以下,直接添加

                       sb.Append((char)bs[i]);

                 else

                 {

                      //以格式化好的样式添加

                      sb.Append("%" + bs[i++].ToString("x").PadLeft(2, '0'));

                      sb.Append("%" + bs[i].ToString("x").PadLeft(2, '0'));

                 }

           }

           return sb.ToString();

     }

     //获取某个页面。以返回流的编码方式,接收返回的信息

     private string Thief(string url)

     {

           string tempurl = UrlEncode(url, System.Text.Encoding.GetEncoding
                ("gb2312"));//url

           HttpWebRequest webr = (HttpWebRequest)WebRequest.Create(tempurl);

                                                        //创建请求

           HttpWebResponse wb = (HttpWebResponse)webr.GetResponse();

           Stream sr = wb.GetResponseStream();             //得到返回数据流

           Encoding encode;

           switch (wb.CharacterSet.ToLower())              //返回数据流的编码方式

           {

                 case "utf-8":

                      encode = System.Text.Encoding.GetEncoding("utf-8");

                      break;

                 case "gb2312":

                      encode = System.Text.Encoding.GetEncoding("gb2312");

                      break;

                 default:

                      encode = System.Text.Encoding.GetEncoding("gb2312");

                                                        //默认为中文

                      break;

           }

           StreamReader sr1 = new StreamReader(sr, encode);

           string zz = sr1.ReadToEnd();                        //读取完成

           sr1.Close();

           wb.Close();//关闭

           return zz;

     }

     //搜索的虚拟方法,由专用类重写,实现自己特定的搜索任务。

     public abstract System.Xml.XmlDocument Search();

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论