Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

Auslesen von XML Dateien mit dem DOM

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.

Schlußbemerkung

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

Download des Codes

Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20000417.zip

Verwandte Artikel

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

Links zu anderen Sites

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.