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

Liste

.NET 2.0 (1)
.NET Allgemein (16)
.NET Fu (5)
ADO.NET (11)
Aprilscherz (3)
ASP Grundlagen (44)
ASP Tricks (83)
ASP.NET (44)
ASPIntranet.de (5)
C# (28)
Datenbank (44)
Dokumentation (4)
IIS 6.0 (1)
Komponenten (29)
Optimierung (10)
Server (21)
Sicherheit (34)
Tee Off (6)
VB.NET (6)
WAP (8)
Web Services (11)
XML (9)

RSS 2.0 - Die neuesten fünf Artikel auf AspHeute.com


 

Suchen





 

English Articles
Chinese Articles
Unsere Autoren
 
Link zu AspHeute
Impressum
Werben
Anfragen

Erstellen von XML-Dateien mit dem DOM

Geschrieben von: Frederic Ganner
Kategorie: XML

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 DOM

Durch 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 Praxisbeispiel

Im 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ßbemerkung

Mit 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 Codes

Klicken Sie hier, um den Download zu starten.

Verwandte Artikel

Auslesen von XML Dateien mit dem DOM
Schreiben einer Textdatei auf den Server
XML-Daten verarbeiten mit XSLT

Links zu anderen Sites

DOM-Referenz bei MSDN
The Understanding XML DOM Game
W3 Dom School
W3C DOM Spezifikation
XMLdir: Artikel und Beispiele

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.

Bewerten Sie diesen Artikel
 Sehr gut   Nicht genügend  
   1  2  3  4  5  
 

  
   Für Ausdruck optimierte Seite

©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.