Geschrieben von: Christoph Wille
Kategorie: XML
This printed page brought to you by AlphaSierraPapa
In den MS Internet Explorer können mit Hilfe von Data Source Objects (DSO) Datenquellen eingebunden werden, die es erlauben, HTML Elemente an Spalten dieser Datenquellen zu binden. Damit kann man sehr einfach und bequem Datenbankdaten am Client rendern, ohne den Server zu belasten. Wie dies mit XML und ASP am besten gelöst werden kann, beschreibe ich in diesem Artikel.
Eine dieser DSO Datenquellen ist das XML Data Source Object, das normalerweise als <OBJECT> Tag eingebunden wird. Damit allerdings ist die Seite abhängig davon, daß ActiveX Komponenten ausgeführt werden dürfen - was heutzutage im Zuge der Sicherheitsprobleme nicht immer gewährleistet ist, da sehr viele Personen diese Option deaktivieren. Um von dieser Problematik wegzukommen, kann man statt dessen XML Data Islands verwenden - das ist XML, das entweder direkt in der Seite eingebettet ist, oder aus einer externen Datei kommen kann.
Ein XML Data Island wird über ein <XML> Tag direkt in das HTML Dokument eingebettet. Dieses Tag kann entweder alle Daten enthalten, oder über das SRC Attribut eine externe Datei ansprechen. Die erste Variante könnte zum Beispiel für das Rendern einer Linksammlung verwendet werden:
Der dazugehörige Sourcecode ist in der Datei simpledataisland.asp enthalten:
<html> <head> <title>XML Data Islands</title> </head> <body bgcolor="#ffffff"> <XML ID="dsoLinks"> <Links> <Link> <Titel>AspHeute</Titel> <URL>http://www.aspheute.com</URL> <Beschreibung>Tägliche Artikel zu ASP</Beschreibung> </Link> <Link> <Titel>AspKurse</Titel> <URL>http://www.aspkurse.com</URL> <Beschreibung>Kurse rund um ASP</Beschreibung> </Link> </Links> </XML> <h2>Die Linksammlung</h2> <TABLE ID="tblLinks" DATASRC="#dsoLinks" CELLSPACING=5> <TR> <TD><A DATAFLD="URL"><SPAN DATAFLD="Titel"></SPAN></A><BR> <i><SPAN DATAFLD="Beschreibung"></SPAN></i></TD> </TR> </TABLE> </body> </html>
Das XML Data Island beginnt mit <XML ID="dsoLinks">, und enthält ein vollständiges XML Dokument. Die ID dsoLinks wird später dazu verwendet, um das Data Island an die Tabelle zu linken:
<TABLE ID="tblLinks" DATASRC="#dsoLinks">Mit dem DATASRC Attribut wird festgelegt, welche Datenquelle verwendet werden soll (das # kennzeichnet eine Datenquelle im aktuellen Dokument).
Um nun einzelne HTML Elemente an eine Spalte der Datenquelle zu binden, verwendet man das DATAFLD Attribut. Dies kann man sogar für das A Element einsetzen, wobei das DATAFLD Attribut das HREF Attribut ersetzt:
<A DATAFLD="URL">
Die Tabelle enthält so viele Zeilen wie auch das XML Data Island.
Derzeit ist die Linksammlung statisch in das HTML Dokument eingebettet. Man könnte sie allerdings ohne weiteres mit ADO am Server generieren lassen, und schon hätte man eine Lösung die auf ASP und XML basiert. Sie hat allerdings einen Nachteil - die Seite lädt immer alle Daten, und wenn mehrere Seiten die gleichen Daten benötigen würden, müßte man den Code überall duplizieren und jede Seite würde die gleichen Daten über das Netz transferieren.
Um das Problem zu umgehen, kann man externe Dateien im XML Element linken:
<XML SRC="my.xml">Natürlich muß es sich nicht um ein statisches XML Dokument handeln, man kann natürlich das XML Dokument am Server generieren lassen.
Um das Ganze mit einem Beispiel zu illustrieren, habe ich eine existierende Tabelle der Northwind Datenbank gewählt, um die externe Datenquelle zu generieren. Die notwendige ASP Datei zur Generierung des XML sieht wie folgt aus:
<% Set conn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") conn.Open "provider=sqloledb.1;user id=sa;password=;" & _ initial catalog=northwind;data source=strangelove" strSQL = "select CategoryName, Description from Categories" rs.Open strSQL, conn Response.ContentType="text/xml" Response.Write "<?xml version=""1.0"" encoding=""Windows-1252""?>" & vbCrlf Response.Write "<Categories>" & vbCrlf While Not rs.EOF Response.Write "<Category>" & vbCrlf For Each fld in rs.Fields strFldName = fld.Name Response.Write "<" & strFldName & ">" & fld.Value & _ "</" & strFldName & ">" & vbCrlf Next Response.Write "</Category>" & vbCrlf rs.MoveNext Wend Response.Write "</Categories>" %>Im Prinzip handelt es sich um eine völlig normale ASP Datei, der Unterschied ist allerdings daß ich den ContentType auf text/xml umstelle, und aus den ADO Recordsetdaten ein XML Dokument bastle, das im Browser betrachtet wie folgt aussieht:
Das so generierte XML Dokument kann man dann in einer HTML Datei in einem XML Data Island einsetzen:
<html> <head> <title>XML Data Islands</title> </head> <body bgcolor="#ffffff"> <XML ID="dsoCategories" SRC="categories.asp"></XML> <TABLE ID="tblCategories" DATASRC="#dsoCategories" BORDER="1"> <TR> <TD><DIV DATAFLD="CategoryName"></DIV></TD> <TD><DIV DATAFLD="Description"></DIV></TD> </TR> </TABLE> </body> </html>Die Verwendung einer externen Quelle ist völlig identisch zu eingebetteten Daten, allerdings sind die Daten nun separat und können von anderen Dateien aus angesprochen werden - und wenn man das XML-generierende ASP Dokument mit einem Response.Expires Statement versieht, kann man ganz einfach Netzwerkbandbreite einsparen.
Natürlich kann man ein Datasource Object auch programmieren! Dazu gibt es die Methoden firstPage, previousPage, nextPage und lastPage. Eingebaut in das vorherige Beispiel sieht das dann wie folgt aus:
Die Anzahl der Zeilen ist auf 3 pro Seite eingeschränkt, und ich habe Buttons für alle Navigationsbefehle eingebaut. Die Änderungen am Sourcecode waren nicht besonders aufwendig:
<html> <head> <title>XML Data Islands</title> </head> <body bgcolor="#ffffff"> <XML ID="dsoCategories" SRC="categories.asp"></XML> <TABLE ID="tblCategories" DATASRC="#dsoCategories" BORDER="1" DATAPAGESIZE=3> <TR> <TD><DIV DATAFLD="CategoryName"></DIV></TD> <TD><DIV DATAFLD="Description"></DIV></TD> </TR> </TABLE> <p> <INPUT TYPE="button" VALUE="<<" ONCLICK="tblCategories.firstPage();"> <INPUT TYPE="BUTTON" VALUE="<" ONCLICK="tblCategories.previousPage();"> <INPUT TYPE="BUTTON" VALUE=">" ONCLICK="tblCategories.nextPage();"> <INPUT TYPE="BUTTON" VALUE=">>" ONCLICK="tblCategories.lastPage();"> </p> </body> </html>Was hat sich alles geändert? Zuallererst habe ich im TABLE Tag das Attribut DATAPAGESIZE eingebaut, um die Anzahl von Zeilen pro Seite auf drei einzuschränken. Ebenso neu hinzugekommen sind 4 Buttons, die jeweils eine Navigationsoperation durchführen. Damit kann man bequem in den Daten blättern, ohne jemals einen Roundtrip zum Server machen zu müssen.
XML Data Islands sind eine Funktionalität, die es nur in Internet Explorer gibt. Allerdings für eine Intranet Anwendung können Data Islands sehr nützlich sein, da man auf diese Weise zB Drop-Down Boxen mit Werten füllen kann, die nur einmal übertragen werden müssen - ein nicht zu unterschätzender Geschwindigkeitsvorteil in einem Bestellsystem mit vielen Vorauswahlen.
This printed page brought to you by AlphaSierraPapa
Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20000407.zip
Binding HTML Elements to Data
http://msdn.microsoft.com/workshop/author/databind/dataconsumer.asp
Binding the XML Data Source Object to Data
http://msdn.microsoft.com/xml/xmlguide/xmldso.asp
©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.