- Разница между картами сайта
- Принцип автоматичекого создания карты сайта
- Структура сайта и листинги файлов
Карта сайта - это страница или специальный файл, где собраны ссылки на все внутренние страницы сайта. Как известно, карта сайта для человека и для поискового робота - это разные вещи. Так, для робота используется специальный XML-файл, в котором указаны ссылки на страницы сайта, которые нужно поместить в поиск, частота обновления указанных страниц и ранг каждой страницы. Для человека - это обычная HTML-страница, на которой собраны ссылки на нужные страницы и упорядочены по разделам для удобного восприятия человеком.
Отсюда вытекает вывод, что веб-дизайнер должен поддерживать сразу 2 файла с картой своего сайта, то есть тратить на эту задачу в два раза больше времени, чем он бы мог. Чтобы упростить жизнь веб-мастерам, я предлагаю поддерживать только одну карту сайта, написанную для робота, а из нее автоматически генерировать HTML-версию карты.
Чтобы автоматически создать карту сайта, нам потребуется:
- Веб-хостинг, поддердивающий asp.net.
- Файл с картой сайта для робота - sitemap.xml.
- Тег <meta name="Description" /> в каждой странице сайта.
- ASPX-cтраница для карты сайта.
Логика работы сценария по созданию карты сайта очень проста:
- Загрузить в память файл sitemap.xml.
- Преобразовать XML-файл в таблицу.
- Отфильтровать из таблицы только ASPX-страницы.
- Определить для каждой страницы ее вложенность.
- Найти файл каждый ASPX-страницы и считать из него тег <meta name="Description" />.
- Преобразовать полученные данные в HTML-формат.
- Вывести полученную карту сайта на страницу карты сайта.
То есть от администратора сайта потребуется только поддерживать файл sitemap.xml, указывая в нем страницы в том порядке, в котором он хотел бы их видеть в HTML-версии карты, а при написании новой страницы вставлять в нее тег <meta name="Description" /> в параметре "content" которого указывать название страницы, которое должно отображаться на карте сайта.
Для того, чтобы осуществить описанный выше сценарий, потребуются следующие файлы и структура сайта:
-|- AppCode - стандартная папка asp.net |- AppData - стандартная папка asp.net |- Bin - стандартная папка asp.net |- Default.aspx - стандартный файл заглавной страницы |- SiteMap.aspx - страница карты сайта |- SiteMap.aspx.vb - логика работы страницы карты сайта |- sitemap.xml - карта сайта для роботов поисковых машин
Листинг файла SiteMap.aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="SiteMap.aspx.vb" Inherits="SiteMapClass" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta name="Description" content="Карта сайта" /> <title>MyDomain - Карта сайта</title> </head> <body> <form id="form1" runat="server"> <div id="SiteMap_Div" runat="Server"></div> </form> </body> </html>
Листинг файла SiteMap.aspx.vb
Partial Class SiteMapClass Inherits System.Web.UI.Page Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles Me.Load SiteMap_Div.InnerHtml = SiteMap("http://www.mydomain.ru", _ Request.PhysicalApplicationPath) End Sub Function ReadXmlFile(ByVal XMLFileName As String, ByVal TableName As String) _ As Data.DataTable Dim TempTable As Data.DataTable = Nothing ' Проверка, что файл существует If IO.File.Exists(XMLFileName) Then Dim mDataSet As New Data.DataSet Dim mStreamRead As New System.IO.FileStream(XMLFileName, _ System.IO.FileMode.Open, IO.FileAccess.Read) mDataSet.ReadXml(mStreamRead) mStreamRead.Close() For Each CurrentTable As Data.DataTable In mDataSet.Tables If CurrentTable.TableName = TableName Then TempTable = New Data.DataTable(CurrentTable.TableName) For Each CurrentColumn As Data.DataColumn In CurrentTable.Columns Dim TempTable_Column As New Data.DataColumn(CurrentColumn.Caption, _ System.Type.GetType("System.String")) TempTable.Columns.Add(TempTable_Column) Next CurrentColumn For Each CurrentRow As Data.DataRow In CurrentTable.Rows Dim TempTable_Row As Data.DataRow = TempTable.NewRow For Each CurrentColumn As Data.DataColumn In CurrentTable.Columns TempTable_Row.Item(CurrentColumn.Caption) = _ CurrentRow(CurrentColumn).ToString Next CurrentColumn TempTable.Rows.Add(TempTable_Row) Next CurrentRow End If Next CurrentTable End If Return TempTable End Function Function CountSymbols(ByVal InLine As String, ByVal Symbol As Char) As Integer Dim mSymbolCounter As Integer = 0 For mCurrentCounter As Integer = 0 To Len(InLine) - 1 If InLine(mCurrentCounter) = Symbol Then mSymbolCounter = mSymbolCounter + 1 Next Return mSymbolCounter End Function Function SiteMap(ByVal SiteBaseName As String, ByVal SitePhysicalPath As String) _ As String ' Таблица для данных файла sitemap.xml Dim mTempTable As New Data.DataTable ' Таблица для построения карты сайта Dim mSiteMapTable As New Data.DataTable("SiteMap") Dim mLinkColumn As New Data.DataColumn("Link") Dim mTitleColumn As New Data.DataColumn("Title") Dim mLevelColumn As New Data.DataColumn("Level") mSiteMapTable.Columns.Add(mLinkColumn) mSiteMapTable.Columns.Add(mTitleColumn) mSiteMapTable.Columns.Add(mLevelColumn) ' Заполнение таблицы данными из sitemap.xml mTempTable = ReadXmlFile(SitePhysicalPath & "sitemap.xml", "url") For Each mTempMapRow As Data.DataRow In mTempTable.Rows ' Фильтрация только страниц .aspx If Right(mTempMapRow(0), 5) = ".aspx" Then ' Построение карты сайта Dim mCurrentLink As String = Nothing Dim mCurrentTitle As String = Nothing Dim mCurrentLevel As Integer = 0 Dim mCurrentSiteMapRow As Data.DataRow Dim mCurrentStreamReader As IO.StreamReader Dim mCurrentLine As String = Nothing ' Получение ссылки страницы отсечением базового имени mCurrentLink = Mid(mTempMapRow(0), Len(SiteBaseName) + 1, _ Len(mTempMapRow(0)) - Len(SiteBaseName)) ' Проверка существования страницы If IO.File.Exists(SitePhysicalPath & mCurrentLink) Then ' Подключение к страницы для считывания содержимого mCurrentStreamReader = New IO.StreamReader(SitePhysicalPath _ & mCurrentLink) ' Поиск в содержимом страницы тега <meta name="Description"> mCurrentLine = mCurrentStreamReader.ReadLine Do While Not mCurrentLine Is Nothing If InStr(LCase(mCurrentLine), LCase("<meta name=""Description""")) _ Then Exit Do mCurrentLine = mCurrentStreamReader.ReadLine Loop If Not (mCurrentLine Is Nothing) Then ' Получение из тега <meta name="Description"> имени страницы Dim mTempStart As Integer = InStr(LCase(mCurrentLine), _ LCase("content=""")) + 9 Dim mTempEnd As Integer = InStr(mTempStart, LCase(mCurrentLine), _ LCase("""")) mCurrentTitle = Mid(mCurrentLine, mTempStart, mTempEnd - mTempStart) ' Отсечение имен корневых страниц разделов If InStr(LCase(mCurrentLink), LCase("Default.aspx")) > 0 Then _ mCurrentLink = Left(mCurrentLink, InStr(LCase(mCurrentLink), _ LCase("Default.aspx")) - 1) ' Определение вложенности страницы mCurrentLevel = CountSymbols(mCurrentLink, "/") If Right(LCase(mCurrentLink), 1) = "/" Then mCurrentLevel = _ mCurrentLevel - 1 ' Добавление заполненной строки к таблицы карты сайта mCurrentSiteMapRow = mSiteMapTable.NewRow() mCurrentSiteMapRow(0) = mCurrentLink mCurrentSiteMapRow(1) = mCurrentTitle mCurrentSiteMapRow(2) = mCurrentLevel mSiteMapTable.Rows.Add(mCurrentSiteMapRow) End If End If End If Next ' Создание HTML-структуры страницы карты сайта Dim mSiteMapText As New StringBuilder For mCurrentRow As Integer = 0 To mSiteMapTable.Rows.Count - 1 Dim mSpaces As String = Nothing For mSpaceCounter As Integer = 0 To _ CInt(mSiteMapTable.Rows(mCurrentRow).Item(2)) * 5 mSpaces = mSpaces & " " Next mSiteMapText.AppendLine("<div>" _ & mSpaces _ & "<a href=""" & SiteBaseName & mSiteMapTable.Rows(mCurrentRow).Item(0) _ & """>" _ & mSiteMapTable.Rows(mCurrentRow).Item(1) & "</a>" _ & "</div>") Next ' Возвращение карты сайта Return mSiteMapText.ToString End Function End Class
Файл sitemap.xml - это стандартый файл для поисковиков Google и Яндекс, его структура описана в статье"Использование sitemap.xml, robots.txt и meta".
Обратите внимание, что в файле SiteMap.aspx.vb в вызове функции формирования карты сайта используется переменная "http://www.mydomain.ru". Эта переменная отвечает за имя домена, которое отрезается от всех ссылок из файла sitemap.xml. Если этот параметр указать неверно, например не указать "www", тогда как в файле sitemap.xml "www" используется, то все ссылки HTML-версии карты сайта будут неверными.