基于C#的网站地图制作

 

前一阵子,和朋友一起做了一个在线英语学习测试的网站,俺给她起名为赤兔英语网(http://www.chituwang.com/,人家都叫搜狐,搜狗啥地,俺就叫她赤兔了,嘿嘿。

 

为啥要做网站地图呢?网站地图在提高网站排名的活动中起着举足轻重的作用,一般作网站的银都知道。^_^除了网站地图本身的重要性以外,还有以下几个原因:

1、  我们的网站是用C#开发的,我们采用数据库存储所有文章信息。所以我们的文章都是动态地从数据库中提取出来的。这点很不利于蜘蛛的顺藤摸瓜。

2、  这点嘛,嘿嘿,就有些勉强了。做个网站地图,可以让用户对敝网站的内容一目了然,能起到很好的导航作用。

 

鉴于上述原因,于是乎,俺就决定为俺地赤兔英语网做一个网站地图。由于Google等搜索引擎所需的网站地图必须是XML文件,所以俺决定做网页形式和XML形式两种网站地图。我们的网站是用C#开发的,当然是使用C#语言来编写俺地网站地图了,赫赫。

 

首先,我们来看看,我们的网站地图该怎么生成,怎么展现。简单思考之后,我决定这样做。网站首页的菜单中添加网站地图选项,其链接着网页形式的网站地图,页面名字为sitemap.html;首页的底部也添加链接网站地图,其链接着XML格式的网站地图,页面名字为sitemap.xml。这两个页面生成程序在后台添加。设置一个按钮,管理员在一段时间内点击该按钮,直接生成这两个文件,放在网站的根目录下,供客户端随时调用。

 

下面,我们来看看生成网站地图的代码的具体实现。为了文章可读性,我们从顶向下来对code实现过程做以介绍。

 

一、网站地图的顶层设计

 

顶层的网站地图生成按钮的code为:

protected void BtnGenerateSitemap_Click(object sender, EventArgs e)

{

createHtmlSitemap();

    createXMLSitemap();

     WebUtility.ResponseScript("网站地图生成完毕!",0);

}

上面code一目了然,createHtmlSitemap()用来生成html网站地图,createXMLSitemap()用来生成XML网站地图。

 

二、Html网站地图的生成

 

我们先介绍Html网站地图的生成。createHtmlSitemap()code如下:

public void createHtmlSitemap()

    {

        FileInfo HtmlFile = null;

        StreamWriter WriteHtmlFile = null;

 

        string FilePath = Server.MapPath("sitemap.html");//获取html文件路径及名称

        HtmlFile = new FileInfo(FilePath);//创建html文件

 

        WriteHtmlFile = HtmlFile.CreateText();

        WriteHtmlFile.WriteLine("<html>");

        WriteHtmlFile.WriteLine("<head>");

        WriteHtmlFile.WriteLine("<meta   http-equiv=Content-Type   content=text/html;charset=UTF-8>");

        WriteHtmlFile.WriteLine("<title>赤兔英语网 网站地图</title>");      

        WriteHtmlFile.WriteLine("</head>");

        WriteHtmlFile.WriteLine("<body>");

 

        getHtmlSitemapData(WriteHtmlFile);

 

        WriteHtmlFile.WriteLine("</body>");

        WriteHtmlFile.WriteLine("</html>");

        WriteHtmlFile.Close();

}

上述code创建了html文件sitemap.html,并使用对象StreamWriter书写了sitemap.html。函数getHtmlSitemapData(WriteHtmlFile)完成了sitemap.html正文部分的组织。

需要注意的是,如果网站地图中有中文,必须将charset设置为UTF-8。否则中文不能正常显示。

 

public void getHtmlSitemapData(StreamWriter writerFile)

    {

        string classTableName = "ArticleClass";

        string articleItemTableName = "ArticleItem";

 

        string connectionString = ConfigurationManager.AppSettings["SQLConnString"].ToString();

 

        SqlConnection conn = new SqlConnection(connectionString);

 

        if (conn.State == ConnectionState.Closed)

        {

            conn.Open();

        }

 

                                     //查询大类信息

        SqlDataAdapter classDataAdpt = new SqlDataAdapter("SELECT Id, Classname FROM " + classTableName, connectionString);

        DataSet classDataSet = new DataSet();

        classDataAdpt.Fill(classDataSet, classTableName);

 

        writerFile.WriteLine("<table border='1' width='1000px'cellspacing='0' cellpadding='0'>");

 

                                     //按照大类信息来查取各个大类下的文章信息

        for (int i = 0; i < classDataSet.Tables[0].Rows.Count; i++)

        {

            string tempsql = "SELECT Id, ArticleTitle, Parentid FROM " + articleItemTableName + " where Parentid = " + classDataSet.Tables[0].Rows[i][0].ToString();

            SqlCommand cmd = new SqlCommand(tempsql, conn);

            if (conn.State == ConnectionState.Closed)

            {

                conn.Open();

            }

            SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

            if (rdr.HasRows)

            {

                int classId = 0;

                int rowNum = 0;//记录处理了篇文章信息

                int memberInLine = 5;//每行显示多少篇文章的链接信息

 

                while (rdr.Read())

                {

                    //处理大类信息,大类也需要以超链接的方式写入html文件

                    if (classId != int.Parse(rdr[2].ToString()))

                    {

                        rowNum = 0;

                        classId = int.Parse(rdr[2].ToString());

                        writerFile.WriteLine("<tr>");

                        writerFile.WriteLine("<td colspan='5'>");

                        writerFile.WriteLine("<a style='font-size:15px;font-weight:bold;' target='_blank' href='http://www.chituwang.com/Article/index.aspx?parentid=" + classDataSet.Tables[0].Rows[i][0].ToString() + "'>" + classDataSet.Tables[0].Rows[i][1].ToString() + "</a>");

                        writerFile.WriteLine("</td>");

                        writerFile.WriteLine("</tr>");

                    }

 

                    //处理文章信息

                    rowNum++;

                    if (1 == (rowNum % memberInLine))//a new line

                    {

                        writerFile.WriteLine("<tr>");

                    }

                    writerFile.WriteLine("<td style='width:200px'>");

                    writerFile.WriteLine("<a target='_blank' href='http://www.chituwang.com/Article/index.aspx?articleid=" + rdr[0].ToString() + "'>" + rdr[1].ToString() + "</a>");

                    writerFile.WriteLine("</td>");

                    if (0 == (rowNum % memberInLine))//a new line

                    {

                        writerFile.WriteLine("</tr>");

                    }

                }

            }

            rdr.Close();

        }

 

        writerFile.WriteLine("</table>");

}

 

三、XML网站地图的生成

 

XML网站地图的生成与Html不同点在于,Google等搜索引擎对这种网站地图的格式有严格的要求,必须遵守,否则不会被他们承认。具体xml文件格式可参考http://www.chituwang.com/Article/WZJS/detail.aspx?articleid=18092

 

createXMLSitemap()函数的实现如下:

public void createXMLSitemap()

    {

        FileInfo XMLFile = null;

        StreamWriter WriteXMLFile = null;

 

        string FilePath = Server.MapPath("sitemap.xml");

        XMLFile = new FileInfo(FilePath);

        WriteXMLFile = XMLFile.CreateText();

            //下面两句话必须写,而且不能做任何修改

        WriteXMLFile.WriteLine("<?xml version=/"1.0/" encoding=/"UTF-8/"?>");

        WriteXMLFile.WriteLine("<urlset xmlns=/"http://www.google.com/schemas/sitemap/0.84/">");

 

        getXMLSitemapData(WriteXMLFile);

 

        WriteXMLFile.WriteLine("</urlset>");//别忘了这句话

        WriteXMLFile.Close();

}

 

createXMLSitemap()的实现如下:

public void getXMLSitemapData(StreamWriter writerFile)

    {

        string classTableName = "ArticleClass";

        string articleItemTableName = "ArticleItem";

 

        string connectionString = ConfigurationManager.AppSettings["SQLConnString"].ToString();

 

        SqlConnection conn = new SqlConnection(connectionString);

 

        if (conn.State == ConnectionState.Closed)

        {

            conn.Open();

        }

 

        //查询大类信息

        SqlDataAdapter classDataAdpt = new SqlDataAdapter("SELECT Id, Classname FROM " + classTableName, connectionString);

        DataSet classDataSet = new DataSet();

        classDataAdpt.Fill(classDataSet, classTableName);

 

        for (int i = 0; i < classDataSet.Tables[0].Rows.Count; i++)

        {

            string tempsql = "SELECT Id, ArticleTitle, Parentid FROM " + articleItemTableName + " where Parentid = " + classDataSet.Tables[0].Rows[i][0].ToString();

            SqlCommand cmd = new SqlCommand(tempsql, conn);

            if (conn.State == ConnectionState.Closed)

            {

                conn.Open();

            }

            SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

            if (rdr.HasRows)

            {

                int subClassId = 0;

 

                while (rdr.Read())

                {

                    //处理大类信息,

                    if (subClassId != int.Parse(rdr[0].ToString()))

                    {

                        subClassId = int.Parse(rdr[0].ToString());

                        writerFile.WriteLine("<url>");

                        writerFile.WriteLine("<loc>" + "http://www.chituwang.com/Article/index.aspx?parentid=" + rdr[2].ToString() + "</loc>");

                        writerFile.WriteLine("<lastmod>" + DateTime.Now.ToShortDateString() + "</lastmod>");

                        writerFile.WriteLine("<changefreq>daily</changefreq>");

                        writerFile.WriteLine("<priority>0.5</priority>");                      

                        writerFile.WriteLine("</url>");

                    }

 

                    //处理文章信息

                    writerFile.WriteLine("<url>");

                    writerFile.WriteLine("<loc>" + "http://www.chituwang.com/Article/index.aspx?articleid=" + rdr[0].ToString() + "</loc>");

                    writerFile.WriteLine("<lastmod>" + DateTime.Now.ToShortDateString() + "</lastmod>");

                    writerFile.WriteLine("<changefreq>monthly</changefreq>");

                    writerFile.WriteLine("<priority>0.4</priority>");                   

                    writerFile.WriteLine("</url>");

                }

            }

            rdr.Close();

        }

    } 

 

通过上面两个小节的介绍,网页和XML两种形式的网站地图就生成了。

 

四、网站地图的提交

 

Google提交网站地图:

  https://www.google.com/webmasters/tools/login?hl=zh_CN

  1、进入这个网址,用你的Google帐户登录,然后添加你的网址;

  2、接下来按照Google的要求验证你网站,你可以选择html文件验证。

  3、这时候,按照Google的要求,制作一个Google要求的文件名的html文件

  4、用FTP讲这个html文件和你的xml格式的网站地图文件一起传到你网站的根目录

  5、确认验证,回到控制台,添加你的地图文件。很快,Google就会根据网站地图文件来更新你的网站

yahoo提交网站地图:

  英文yahoo提交网址:

  http://search.yahoo.com/info/submit.html

  首先用FTP讲你的网站地图传到网站的根目录。打开网址后,选择Submit Your Site for Free: yahoo帐户登录,然后输入你的网站地图的URL就可以了。

  中文Yahoo的提交网址:

  http://sitemap.cn.yahoo.com/mysites

  这个操作和Google的差不多,登录、验证网站、提交网址地图URL

向MSN提交网站地图Sitemap: 用URL直接提交:http://api.moreover.com/ping?u=http://your.domainname/sitemap.xml

 

这是向MSN直接提交网站地图的后门URL
向ASK提交网站地图Sitemap: 直接提交。http://submissions.ask.com/ping?sitemap=http://your.domainname/sitemap.xml

向网店联盟提交地址:http://www.dianmeng.com/

向百度Baidu提交网站地图Sitemap: 没办法,现在百度不支持Sitemap。但可通过http://www.baidu.com/search/url_submit.html来提交你的网址。

你可能感兴趣的:(html,String,C#,Google,Yahoo,dataset)