Erstellen von XML-Dateien mit dem DOM
Geschrieben von: Frederic Ganner Zur Bearbeitung von XML-Dateien bietet das Document Object Model (DOM) ein vielseitiges und praktisches Repertoire an. Nach dem vorangegangenen Artikel Auslesen von XML Dateien mit dem DOM befasst sich dieser mit der Erstellung von XML Dokumenten, beschränkt sich dabei aber nicht auf die Arbeit mit dem DOM, sondern zeigt auch einfachere Wege zum Ziel. Über die Erklärung der einzelnen Möglichkeiten des DOMs hinaus wird die Anwendung am Beispiel einer Sendung von Bestelldaten gezeigt. Die einfachste Methode ein XML Dokument zu erstellen ist sicherlich den Text der XML Datei in den Output-Stream zu schreiben. Ein Vorteil liegt in der Geschwindigkeit, da im Vergleich zum Aufbau eines DOM-Trees kaum Belastung für den Server anfällt. Da man das DOM nicht benützt, muß natürlich auch die MSXML-Komponente am Server nicht installiert sein. Wenn man also auf eine Weiterverarbeitung und Caching am Server verzichten kann, tut es auch diese Variante. Im folgenden Beispiel (stats.asp) werden Daten aus einer Datenbank ausgelesen, und als einfacher Text-Stream an den Client weitergegeben. Natürlich könnte man es auch als Textdatei speichern, wie im Artikel Schreiben einer Textdatei auf den Server erklärt. <% Response.ContentType = "text/xml" %> <?xml version="1.0" encoding="windows-1252" ?> <Stats> <% strConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & Server.MapPath("bestellungen.mdb") Set conn = Server.CreateObject("ADODB.Connection") conn.Open strConnStr Set RSobj = Server.CreateObject("ADODB.Recordset") RSobj.ActiveConnection = strConnStr RSobj.Source = "SELECT * FROM Statistik" RSobj.CursorType = 0 RSobj.CursorLocation = 2 RSobj.LockType = 3 RSobj.Open RSobj.MoveFirst While Not RSobj.EOF %> <Zeitraum> <Visits><%= RSobj.Fields("Visits") %></Visits> <PageImpressions><%= RSobj.Fields("PageImpressions") %></PageImpressions> <AdClicks><%= RSobj.Fields("AdClicks") %></AdClicks> <Traffic><%= RSobj.Fields("Traffic") %></Traffic> </Zeitraum> <% RSobj.MoveNext Wend RSobj.close conn.close %> </Stats> Das DOMDurch ein Interface zum Zugriff, zur Erstellung und Veränderung von XML-Daten stellt sich das DOM im Vergleich zur oben vorgestellten Methode als weit eleganter dar. Außerdem hat das Erstellen von Dokumenten mit dem DOM die entscheidenden Vorteile, daß das Ergebnis auf jeden Fall well-formed ist, und der modulare Aufbau eines DOM-Dokuments eine weit flexiblere Handhabung als bei Text-Streams zuläßt. Sehen wir uns zunächst in der folgenden Grafik die Struktur eines DOM-Dokuments mit seinen wichtigsten Elementen und Beziehungen an: Beim Aufbau eines XML-Trees wird zuerst das DOM-Document initialisiert. Es enthält nur die Root Node, die ihrerseits alle weiteren Elemente enthält. Die Eigenschaften des Dokuments, wie zB. die Angabe der DTD bzw. des Schemas, werden auch an die Root Node als Attribute angehängt, obwohl diese im eigentlichen Code im Prolog, also vor dem Wurzelelement, stehen. Set XMLDoc = Server.CreateObject("Msxml2.DOMDocument") Eventuelle Kommentare werden durch .CreateComment() analog zum Anhängen von Elementen an das Root-Element angefügt: Set Comment = XMLDoc.CreateComment("this is an xml file!") XMLDoc.AppendChild(Comment) Wenn Verweise zu XSL-Stylesheets verwendet werden, sind diese zwar auch im Prolog zu finden, es ist jedoch egal wo man sie mit dem DOM definiert. Set XSL = XMLDoc.CreateProcessingInstruction("xml-stylesheet","type=""text/xsl"" href=""wildstyle.xsl""") XMLDoc.AppendChild(XSL) Alle Elemente werden durch die Methode .CreateElement() erstellt. Der eigentliche Aufbau folgt einem immer gleichen Muster: Ein Element wird definiert und dann als child an das im Document-Tree nächsthöhere Element angehängt. Set child = XMLDoc.CreateElement("Bestellungen") parent.AppendChild(child) Einem definierten Element können durch .SetAttribute() Attribute zugewiesen werden. Dementsprechend kann durch .GetAttribute() auf die Eigenschaften eines Elementes zugegriffen werden. Wenn man anstelle einer DTD ein Schema verwendet, kann man den Elementen Datentypen zuweisen. Der Name des Attributs wird dazu mit dem String "type" belegt, und der Wert des Attributs mit der Bezeichnung des Datentyps. Um die Zahl der Elemente zu minimieren, ist es natürlich ratsam kleine Angaben in ein Attribut zu setzen, anstatt für jede Kleinigkeit ein eigenes Element zu erschaffen. Element.SetAttribute("type", "string") Element.SetAttribute("Name", "Schmidt") Um ein Element mit Inhalt zu füllen weist man der Eigenschaft .Text den entsprechenden Wert zu. Dabei ist zu beachten, daß .Text eine Eigenschaft ist und keine Methode. Daneben ist es auch möglich, Text über die Methode .CreateTextNode() anzuhängen. Element.Text = "der text" Wenn man allerdings HTML-Code als Inhalt einfügen will, darf dieser natürlich nicht mitgeparsed werden, und muß deshalb in separaten CDATA-Sections untergebracht werden. Die Sections werden als eigene Nodes erstellt, die jedoch nicht an Attribut-Nodes anhängbar sind. Set escapedcontent = XMLDoc.createCDATASection("<b>Ein Beispiel ...</b>") Element.AppendChild(escapedcontent) Mit der .Save() Methode wird das Ganze schließlich abgespeichert. XMLDOC.Save(Server.MapPath("sample.xml")) Ein PraxisbeispielIm folgenden Beispiel werden Bestelldaten aus einer Access-Datenbank ausgelesen und in ein XML-Dokument verpackt. Aus dem Access-Standarddatum wird dabei ein XSD-konformes Datum nach dem Format "yyyy-mm-dd" gemacht. Das Element "Artikel" enthält sowohl den Artikelnamen, als auch die Artikelnummer, die dem Element als Attribut zugewiesen wurde. Bei dem Datum-Element wäre diese Methode naürlich nicht möglich, da sich Datentypen nur auf den Inhalt von Elementen beziehen, nicht aber auf deren Attribute (dom.asp) <% @Language = "VBScript" %> <% strConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & Server.MapPath("bestellungen.mdb") Set conn = Server.CreateObject("ADODB.Connection") conn.Open strConnStr Set RSobj = Server.CreateObject("ADODB.Recordset") RSobj.ActiveConnection = strConnStr RSobj.Source = "SELECT * FROM Bestellungen" RSobj.CursorType = 0 RSobj.CursorLocation = 2 RSobj.LockType = 3 RSobj.Open RSobj.MoveFirst Set XMLDoc = Server.CreateObject("Msxml2.DOMDocument") Set Root = XMLDoc.CreateElement("Bestellungen") XMLDoc.AppendChild(Root) Root.SetAttribute "xmlns", "somenamespace" Root.SetAttribute "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance" Root.SetAttribute "xsi:schemaLocation", "somenamespace C:\path\schema.xsd" i=0 While Not RSobj.EOF dtDatum = CDate(RSobj.Fields("datum")) strArtikelname= RSobj.Fields("artikelname") intArtikelnummer = RSobj.Fields("artikelnummer") intAnzahl = RSobj.Fields("anzahl") intPreis = RSobj.Fields("preis") Set Bestellung = XMLDoc.CreateElement("Bestellung") Root.AppendChild (Bestellung) Set Datum = XMLDoc.CreateElement("Datum") If Len(CStr(Month(dtDatum))) = 1 Then Monat = "0"& Month(dtDatum) Else Monat = Month(dtDatum) End If If Len(CStr(Day(dtDatum))) = 1 Then Tag = "0"& Day(dtDatum) Else Tag = Day(dtDatum) End If Datum.Text = Year(dtDatum)&"-"& Monat &"-"& Tag Bestellung.AppendChild (Datum) Datum.SetAttribute "type", "date" Set Artikel = XMLDoc.CreateElement("Artikel") Artikel.Text = strArtikelname Bestellung.AppendChild (Artikel) Artikel.SetAttribute "type", "integer" Artikel.SetAttribute "ArtNummer", intArtikelnummer Set Anzahl = XMLDoc.CreateElement("Anzahl") Anzahl.Text = intAnzahl Bestellung.AppendChild (Anzahl) Anzahl.SetAttribute "type", "integer" Set Preis = XMLDoc.CreateElement("Preis") Preis.Text = intPreis Bestellung.AppendChild (Preis) Preis.SetAttribute "type", "decimal" i=i+1 RSobj.MoveNext Wend XMLDOC.Save(Server.MapPath("sample.xml")) Response.Write(i&" Einträge aus der Datenbank in XML-file übetragen") %> Das fertige Dokument sieht im Browser dann folgendermaßen aus: SchlußbemerkungMit dem Document Object Model besitzt man als ASP Programmierer eine leicht zugängliche, und trotzdem tiefgehende Brücke zwischen Anwendungen und XML-Dateien. Zwar bieten sich zur Behandlung von XML-Daten mit dem DOM inzwischen einige Alternativen aus den Bereichen .NET und SAX, aber gerade wegen der Möglichkeiten zur Validierung und beispielsweise des Schema Supports bleiben wohl reichlich Gelegenheiten das DOM zu verwenden. Download des CodesKlicken Sie hier, um den Download zu starten. Verwandte Artikel
Auslesen von XML Dateien mit dem DOM Links zu anderen Sites
DOM-Referenz bei MSDN Wenn Sie jetzt Fragen haben...Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten. Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.
Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.
©2000-2006 AspHeute.com |