Geschrieben von: Christoph Wille
Kategorie: XML
This printed page brought to you by AlphaSierraPapa
Die erste Frage ist, wofür steht das TLA (three letter acronym=Drei-Buchstaben Akü) DOM? DOM ist die Kurzform für Document Object Model, und dieses definiert wie HTML oder XML Dokumente plattformübergreifend mit einem Objektmodell bearbeitet werden können. Dieses DOM ist ein Standard des W3C Consortiums, und MS hat sich bei der Implementierung an die Richtlinien gehalten - am Ende des Artikels findet sich der Link zum W3C als Beweis.
Ich empfehle nicht, sich das DOM anhand der Spezifikation des W3C anzulernen - statt dessen mit Beispielen, die man auch sofort einsetzen kann. Um die nun folgenden Beispiele mit Leben zu erfüllen, existiert eine täglich aktuelle XML Datei auf AspHeute.com, nämlich currentarticles.xml. Diese hat folgendes Format:
<?xml version="1.0" encoding="Windows-1252"?> <articles> <article> <title><![CDATA[Probleme beim Verarbeiten von Datumswerten]]></title> <author><![CDATA[Christian Koller]]></author> <url><![CDATA[http://www.aspheute.com/artikel/20000413.htm]]></url> <date><![CDATA[13.4.2000]]></date> <description><![CDATA[Als Entwickler ... liefert.]]></description> </article> .... </articles>
Jeder Artikel wird mit fünf Eigenschaften beschrieben: Titel (title), Autor (author), URL (url), Datum (date) und Beschreibung (description). Es handelt sich hierbei um eine "beinahe" standardmäßige XML Datei, allerdings denke ich mir, daß viele mit der CDATA Sektion noch nichts zu tun hatten:
<![CDATA[ ... ]]>Eine CDATA Sektion schließt Code ein, der vom XML Parser mißinterpretiert werden könnte, so zum Beispiel HTML Tags - und das ist auch der Hauptgrund, warum in dieser XML Datei CDATA Sektionen vorhanden sind - damit jederzeit Markup Tags eingefügt werden können, um die Beschreibung zu formatieren.
Um zu beweisen, daß die Datei gültig ist, kann man sie im Internet Explorer aufmachen - dieser formatiert sie dann mit einem Standardstylesheet:
Wenn meine Kunden mit einer XML Datei glücklich wären, dann könnte man es ja so vom Webserver abschicken. Allerdings gibt es zwei Hindernisse - ich glaube kaum, daß jemand diesen XML-Output gerne liest, und zweitens kann ein Netscape (4.x) mit XML absolut rein gar nichts anfangen. Also gute Gründe, am Server mit ASP aus dieser XML Datei ein "anschaubares" Ergebnis zu zaubern.
Die erste Variante wäre, den Inhalt der XML Datei ganz einfach mit Hilfe des XML DOM's auszugeben (iteratexml.asp; Erklärung folgt):
<% @LANGUAGE = VBScript %> <html> <head> <title>Rekursive Ausgabe einer XML Datei</title> </head> <body bgcolor="#ffffff"> <% Dim XMLDoc, rootNode, item Set XMLDoc = Server.CreateObject("Microsoft.XMLDOM") XMLDoc.async = False bLoadSuccess = XMLDoc.load(Server.MapPath("currentarticles.xml")) If Not bLoadSuccess Then Response.Write "Could not load the XML document!" Else Set rootNode = XMLDoc.documentElement strOut = OutputNode(rootNode,1) Response.Write "<PRE>" & vbCrlf Response.Write strOut Response.Write "</PRE>" & vbCrlf End If Function OutputNode(ByVal node, ByVal nDepth) strPadding = Space(nDepth) strOutput = strOutput & strPadding & "<" & node.nodeName & _ ">" & vbCrLf For Each item in node.childNodes If item.hasChildNodes() Then strOutPut = strOutput & OutputNode(item,nDepth+1) Else strOutput = strOutput & strPadding & "<" & item.nodeName & ">" strOutput = strOutput & item.Text strOutput = strOutput & "</" & item.nodename & ">" & vbCrLf End If Next strOutput = strOutput & strPadding & "</" & node.nodeName & _ ">" & vbCrLf OutputNode = strOutput End Function %> </body> </html>
Das XML DOM stellt ein XML Dokument über ein Objekt mit der ProgId "Microsoft.XMLDOM" zur Verfügung. Damit können XML Dateien geladen und gespeichert werden. Wenn der Ladevorgang erfolgreich war, kann man die Root Node - das erste XML Element - mit .documentElement abholen. In unserem Beispiel ist das erste Element <articles>.
Da jede Node mehrere Kinder (<articles> enhält mehrere <article> Elemente) enthalten kann, habe ich die rekursive Funktion OutputNode programmiert. In dieser passiert folgendes: Der Name der aktuellen Node wird ausgelesen (.nodeName), ebenso der Wert (.Text). Damit wird ein Output generiert, der (beinahe) wieder so aussieht, wie das originale XML Dokument.
Die Rekursion beginnt dann, wenn das gerade zu bearbeitende Kind (in der For...Next Schleife werden die Kinder der aktuellen Node bearbeitet) weitere Kinder hat - dies wird mit der hasChildNodes Eigenschaft festgestellt - dann ruft OutputNode sich selbst mit dem Kind als Parameter auf. Diese Rekursion wird für jeden Ast des Baums durchgeführt.
Eigentlich wolle ich ja eine ansprechende Ausgabe produzieren, und nicht wieder unlesbaren Pseudo-XML Code. Und außerdem sollte der ASP Code auf den Anwendungsfall abgestimmt sein, also auf die Struktur des XML Dokuments, das verwendet wird. Um diese Anforderungen zu erfüllen, habe ich xmldomoutput.asp erstellt:
<% Set XMLDoc = Server.CreateObject("Microsoft.XMLDOM") XMLDoc.async = False strXMLLocation = Server.MapPath("currentarticles.xml") bSuccess = XMLDoc.load(strXMLLocation) If Not bSuccess Then Response.Write "Loading the XML file <b>" & _ strXMLLocation & "</b> failed!" Response.End End If Set rootNode = XMLDoc.documentElement If rootNode.hasChildNodes() Then Response.Write "<table border=""0"" cellspacing=""5"">" For Each article in rootNode.childNodes strTitle = article.childNodes(0).text ' title strAuthor = article.childNodes(1).text ' author strURL = article.childNodes(2).text ' url strDate = article.childNodes(3).text ' date strDescription = article.childNodes(4).text ' description Response.Write "<tr><td>" Response.Write "<font size=1><b>[" & strDate & _ "]</b></font> " Response.Write "<a href=""" & strURL & """>" & _ strTitle & "</a>" Response.Write "</td></tr>" & vbCrlf Next Response.Write "</table>" Else Response.Write "Keine Artikel gefunden!" End If %>
Dieser Code weiß bereits, wie die ausgelesene XML Datei aufgebaut ist. Und somit kann ich die jeweiligen Elemente auslesen, und dann damit die von mir gewünschte Formatierung/Ausgabe erreichen - in diesem Fall eine Ausgabe als Liste, ohne Beschreibung und Autor. Dies kann aber nach eigenen Wünschen geändert werden.
In der Datei iteratexml.asp habe ich mich über einen wichtigen Aspekt einer Node hinweggeschummelt - eine Node kann Attribute besitzen, so zum Beispiel:
<article author="Christoph Wille" title="XML Games"/>Ich würde es fast als Geschmacksfrage bezeichnen, ob man Einzelwerte als Nodes oder Attribute der Elternnode ausführt.
Bei dieser ersten Einführung in die Verwendung des DOM für das Auslesen von Informationen habe ich Sortierungen und Einschränkungen der Elemente ausgelassen - das ist ein Thema eines weiteren Artikels.
This printed page brought to you by AlphaSierraPapa
Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20000417.zip
Arbeiten mit dem SQL Server XML View Mapper
http:/www.aspheute.com/artikel/20020416.htm
Einfaches XML-Auslesen in .NET
http:/www.aspheute.com/artikel/20001117.htm
Einsatz des Recordset Objektes als Multifunktionaler Datenspeicher
http:/www.aspheute.com/artikel/20000516.htm
Erstellen von XML-Dateien mit dem DOM
http:/www.aspheute.com/artikel/20011116.htm
Verwendung von XML-Schemas (XSD)
http:/www.aspheute.com/artikel/20010925.htm
XML-Daten verarbeiten mit XSLT
http:/www.aspheute.com/artikel/20020116.htm
Aktuelle AspHeute Artikel als XML
http://www.aspheute.com/currentarticles.xml
W3C Document Object Model
http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/
©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.