Web Development

Pagemap - Beschreibung einer Datenbank-gesteuerten Web-Site in XML

Automatische Erzeugung von Google-Sitemaps

Google bietet schon seit Längerem Webmastern die Möglichkeit die Struktur ihrer Web-Site der Suchmaschine zu melden, damit zum Beispiel Änderungen schneller erfasst und gefunden werden können. Zu diesem Zweck wurde das Sitemap-Protokoll entwickelt, dessen Basis eine maschinenlesbare XML-Datei darstellt, in dem die einzelnen URL's einer Web-Site erfasst sind.

Das Format ist derart erfolgreich, dass Yahoo und sogar Microsoft auf den Zug aufgesprungen sind und Ende 2006, gemeinsam mit Google, das Sitemap-Protokoll in der Version 0.9 auf www.sitemap.org veröffentlicht haben. Dort kann man sich auch die aktuell gültige Spezifikation ansehen.

Einreichen kann man die Sitemaps bei Google über die Webmaster-Tools. Bei Yahoo gelingt dies über den im Beta-Status befindlichen Yahoo Site Explorer. In beiden Fällen benötigt man bei der jeweiligen Suchmaschine ein Konto und muss eine Verifizierungsdatei auf den eigenen Web-Server legen. Microsoft bietet hingegen für seine Suchmaschine search.live.com bzw. den Crawler MSNBot noch keine Möglichkeit eine Sitemap einzureichen.

Die Sitemap-Struktur

Das Sitemap-Format ist recht simpel, denn es besteht nur aus einer Handvoll XML-Tags und ist ausgezeichnet dokumentiert:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
   <url>
    <loc>http://www.example.com/</loc>
    <lastmod>2005-01-01</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
   </url>  
</urlset>

Alles beginnt mit dem Root-Tag urlset, das über das Attribut xmlns auf den Protokollstandard verweist. Unterhalb dieses Wurzelelements können unendlich viele url-Tags definiert werden. Jedes einzelne stellt eine URL der zu beschreibenden Web-Site dar. Zur näheren Beschreibung einer URL gibt es unterhalb von url wiederum 4 Tags, die zum Teil optional sind:

Tag Beschreibung optional
loc URL der Seite Nein
lastmod Datum der letzten Änderung Ja
changefreq Änderungshäufigkeit (always, hourly, daily, weekly, ...) Ja
priority Priorität gegenüber anderen URL der Web-Site Ja

Das war es im Prinzip auch schon. Mit dieser Struktur, die man über verschiedene Ebenen verschachteln kann, ist jeder Web-Master in der Lage seine Web-Site in maschinenlesbarer Form abzubilden.

In der Praxis ist es aber eher mühsam bei jeder Änderung der Seitenstruktur die XML-Datei anzupassen. Vor allem, wenn man eine sehr rege genutzte Seite wie ein Blog betreibt. Aus diesem Grund bietet unter anderem Google einen Sitemap-Generator der einem diese Arbeit etwas erleichtern kann. Desweiteren gibt es inzwischen zahllose freie oder kommerzielle Tools, die eine Web-Site scannen und Sitemap-Dateien erzeugen können.

Alle diese Tools haben aber ihre Nachteile. Zum Teil sind sie, wie der Sitemap-Generator von Google, in Sprachen wie Python geschrieben, die zunächst die Installation von diversen Software-Paketen erfordern, oder sie kommen nur mit starren HTML-Strukturen zurecht. Ein wirklich dynamisches System für Datenbank-gestützte Blog-Systeme wie zerbit.de zum Beispiel, ist mir noch nicht untergekommen.

Aus diesem Grund habe ich die Pagemap-Struktur entwickelt, die in der Lage ist, eben auch dynamisch erzeugte Web-Site zu beschreiben und als Basis für automatisch generierte Sitemap-Dateien dienen kann.

Pagemap - Die Alternative für Generatoren

In einer Sitemap-Datei muss für jede zu indizierende URL ein Eintrag vorhanden sein. Betreibt man nun beispielsweise Datenbank-gestütztes Blog dessen Beiträge über ein und dieselbe URL, aber mit unterschiedlichen Parametern aufgerufen werden, so müsste man, bei 20 Beitrags-Datensätzen, 20 einzelne Einträge in der Sitemap generieren.

Auf dieser Web-Site ist dies z.B. der Fall. Die einzelnen Artikel sind u.a. über die URL http://www.zerbit.de/artikel/show.aspx?id=XXX aufrufbar, wobei die ID für die Nummer des aus der Datenbank abzurufenden Artikels steht. Wenn ich nun, wie gerade, einen neuen Artikel schreibe, dann müsste ich nach der Fertigstellung entweder die Sitemap manuell ergänzen oder einen Generator über die Site laufen lassen.

Weil ich für die Anzeige der Artikel und Beiträge schon alles weitgehend automatisiert hatte, war es für mich nicht einzusehen, wegen der Sitemap noch einmal Hand anzulegen. Ein Automatismus musste her; eine Definition meiner Web-Site unter Einbeziehung der dynamisch generierten URL's...

Definition einer Datenbank-gestützten Web-Site in XML

Googles Idee eine Web-Site mit XML zu beschreiben ist ja bestechend, also verfolgte ich diesen Ansatz, allerdings etwas hierarchischer, denn eine Site besteht meist aus mehreren Ebenen, angefangen mit der Startseite und das ist in einer Suchmaschinen-Sitemap nicht abbildbar. Pate für die neue Struktur stand dabei auch Microsofts ASP.NET Sitemap-Modell. Mithilfe dieser XML-Struktur kann man ASP.NET-Seiten hierarchisch beschreiben und daraus z.B. automatisch normale Sitemaps für Webs generieren.

Eine Pagemap-XML-Struktur geht allerdings noch einen Schritt weiter, denn in ihr können, neben starren HTML-Seiten, auch Definitionen zu Datenbank-gestützten URL's abgelegt werden, d.h. man definiert lediglich die Parameter für einen Datenbankzugriff und den Rest erledigt ein Stückchen Code das die Datensätze iteriert.

Beginnen wir mit dem Wurzelelement. Die heißt schlicht pagemap und besitzt nur ein Attribut namens site, das den Namen der Web-Site aufnimmt:

<?xml version="1.0" encoding="iso-8859-1"?>
<pagemap site="www.meinblog.de">
  ...
</pagemap>

Unterhalb der Wurzel können nun einzelne Seiten mithilfe des Tags page abgelegt werden:

<?xml version="1.0" encoding="iso-8859-1"?>
<pagemap site="www.meinblog.de">
   <page>...</page>
   <page>...</page>
   ...
</pagemap>

Diese Seitendefinitionen können auch gleichzeitig die Hierarchie der Site beschreiben, wenn man sie entsprechend verschachtelt:

<?xml version="1.0" encoding="iso-8859-1"?>
<pagemap site="www.meinblog.de">
   <page>...</page>
   <page>
      <page>...</page>
      <page>...</page>
      <page>
         <page>...</page>
         <page>...</page>
      </page>
   </page>
   ...
</pagemap>

Alle page-Tags besitzen erforderliche und optionale Attribute, die die einzelnen Seiten beschreiben:

Attribute

Attribut Beschreibung optional
title Titel der Seite Nein
file relativer Pfad zur Seite Nein
type Seitentyp (static, dynamic) Nein
changefreq Änderungshäufigkeit (always, hourly, daily, weekly, monthly, yearly, never) Ja
priority Priorität gegenüber anderen Seiten der Site (Zahl zwischen 0,0 und 1,0) Ja

Dynamische Seiten (type=dynamic), geschrieben in Server-Sprachen wie ASP. ASP:NET, PHP oder ähnlichem, besitzen neben diesen Attributen weitere Unterelemente, mit denen die Datenbankanbindung beschrieben werden kann:

Unterelement Beschreibung
parameter Name des Parameters, über den die Seiten abgerufen werden (z.B. ID)
sqlselect SELECT-String mit dem die Datensätze aus der Datenbank abgerufen werden (CDATA-Abschnitt)
idfield Feldname des Schlüsselwertes der mit dem Übergabeparameter korrespondiert
titlefield Feldname des Seitentitels
datefield Feldname eines Datumsfeldes, in dem das letzte Update des Datensatzes abgelegt wird

Die pagemap-Beschreibung eines kleines Weblog könnte dann zum Beispiel so aussehen:

<?xml version="1.0" encoding="iso-8859-1"?>
<pagemap site="www.meinblog.de">

   <page title="Startseite" file="/index.asp" type="static"
         changefreq="weekly" priority="1.0">

      <page title="Beiträge" file="/weblog/index.asp" type="static"
            changefreq="weekly" priority="1.0">

         <page file="/weblog/article.asp" type="dynamic">
            <parameter>id</parameter>
            <sqlselect>
               <![CDATA[SELECT * FROM tblBeitraege ORDER BY LastUpdate DESC]]>
            </sqlselect>
            <idfield>ID</idfield>
            <titlefield>TITLE</titlefield>
            <datefield>LASTUPDATE</datefield>
         </page>

      </page>

      <page title="News-Feeds" file="/rssfeeds.asp" type="static" />
      <page title="Impressum" file="/impressum.asp" type="static" priority="0.1" />
      <page title="Kontakt" file="/kontakt.asp" type="static" />

   </page>
</pagemap>

Verarbeitung einer Pagemap

Mit dieser Struktur und mit den teils Sitemap-spezifischen Attributen ist es nun ein leichtes eine Suchmaschinen-Sitemap zu erstellen. Zum anderen kann man diese Site-Definition auch wunderbar dazu nutzen, eine normale, grafische Sitemap, wie sie viele Web-Sites anbieten, automatisch zu erzeugen. Die einzige Änderung die man manuell durchführen muss ist, wenn man weitere statische Seite in die Site einfügt.

Die Konvertierung der Pagemap zu einer Sitemap für Google und Co. geschieht in einer eigens dafür angefertigten ASP, ASP.NET oder PHP-Seite, die zum einen die Informationen zu statischen HTML-Seiten und zum anderen, mit den Datenzugriffsinformationen, iterativ alle Datensätze aus der Datenbank in Sitemap-XML umsetzt.


(klicken zum vergrößern)

Der Verarbeitungsablauf schematisch dargestellt:

Alle statischen Seiten in der Pagemap-Definition werden über eine Hilfsfunktion direkt als XML ausgegeben. Für die dynamischen Seiten wird zunächst Verbindung mit der Datenbank aufgenommen und dann werden alle Datensätze einzeln über die Hilfsfunktion in XML-Markup umgesetzt.

Ein ASP-Beispiel, wie ich es für diese Web-Site verwende, gibt es weiter unten im Abschnitt Downloads.

Erweiterungen

Wenn man die Häufigkeit der Änderungen und die Priorität für dynamische Seiten ebenfalls ausgeben möchte, müsste die Struktur und der Ausgabe-Code noch um die entsprechenden Definitionen der Datenbankfelder bzw. ein paar Zeilen Code ergänzt werden. In meinem Beispiel habe ich darauf verzichtet und übergebe der Suchmaschine lediglich das LastUpdate-Datum. Man könnte auch allen dynamischen Seiten eines Typs eine feste Priorität zuweisen.

Ausblick

Ich werden mich demnächst daran setzen eine ASP.NET-Umsetzung des Ausgabe-Codes einer Pagemap-Struktur zu entwickeln und sie ebenfalls hier veröffentlichen.

Es wäre wunderbar, wenn der ein oder andere Leser, der meine Idee aufgreift und entsprechenden Ausgabe-Code in anderen Server-Sprachen wie PHP, Ruby oder ähnlichem schreibt, sich zwecks Veröffentlichung hier auf der Seite mit mir in Verbindung setzt.

Downloads

Pagemap Ausgabe-Code für Sitemap-Dateien in ASP (pagemap_asp_beispiel.zip)
kick it on dotnet-kicks.de AddThis 0 wikio-Stimme(n) Trackback-Url...

Keine Kommentare bislang...

Dein Kommentar hierzu...


Kommentar-Feed für diesen Beitrag
Gravatare werden unterstützt .:. eMail-Adressen werden nicht veröffentlicht
 

RSS-Feed

Die URL des Standard-Newsfeed von zerbit.de lautet:

http://www.zerbit.de/rssfeed.aspx

Login


 

 

Statistik



kürzlich kommentiert

Artikel 64

  • Datum: 20.03.2007
    Kategorie: Web Development
    Zugriffe: 5.063
    Kommentare: 0
    Trackbacks: 0

Letzte Beiträge

Kategorien

Buttons & More

Blog-Roll

Banner Piraten-Partei