Simple XML (1/2)

Simple XML. Grundsätzlicher Umgang mit XML.

Heute geht es mal ein wenig um XML und Datenbindung. Genauer werden wir ein kleines Programm entwickeln, welches Daten in einer XML Datei hält. Diese Daten werden wir lesen, schreiben, bearbeiten und filtern. Also alle Basics einführen, die man für den richtigen Umgang mit Daten braucht.
XML ist als Format in den letzten Jahren sehr beliebt geworden, und das zu Recht. Stellt diese Art der Datenhaltung doch ein Austauschformat dar, welches universell einsetzbar und dank strukturierter Informationshaltung sehr flexibel handhabbar ist.
Weiterführende Themen wie Schemas und Transformationen werden ich in diesem Artikel ausklammern und erstmal nur die grundsätzliche Arbeit mit XML unter .Net vorstellen und damit einen Einstieg geben. In unserem Beispiel entwickeln wir eine kleine aber auch fast klassische Anwendung: Eine CD-Sammlung.

Für unser Beispiel beginnen wir eine neue Windows-Applikation im VS2005 und fügen dem VS-Projekt eine XML-Datei als neues Element hinzu. Diese nennen wir in Data.xml um und geben (als erstes Beispiel per Hand) eine Datenstruktur vor.

1. Das XML-File.



  
    1
    Counting Crows
    Recovering the Satellites
  

Die einzelnen Elemente einer CD erklären sich wohl von selber, einzig das InternalNumber-Element bedarf einer weiteren Erläuterung. In diesem Feld wollen wir eine eindeutige Sortierung halten und automatisch erstellen. Mehr dazu weiter unten.

2. Daten bereitstellen. Nun wollen wir unserem Programm die Daten aus dem XML-File zur Verfügung stellen und realisieren dazu in der Form_Load-Methode einen Datenzugriff.
Hierzu initialisieren wir eine Klassenkonstante und zwei Klassenvariablen um flexibleren Zugriff auf einige Objekt haben zu können.

Zum einen eine Konstante die den Pfad zu unserem Daten-XML-File enthält.

Private Const _sPATH_TO_XML_FILE As String = "C:\Devstack\EasyXML\Data.xml"

Dann zwei Variablen, die zur Laufzeit zugewiesen werden und hier nur initialisiert werden. Zum einen ein DataSet und zum anderen eine DataTable um die XML-Daten handhaben zu können.

Private _oDataSet As DataSet
Private _oDataTable As DataTable

Kommen wir dann zu der Form_Load-Methode:

Private Sub fMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    InitData()
End Sub

Nicht eben spektakulär. Aber sinnvoll, nicht nur aus ästhetischer Sicht, sondern auch aus struktureller. Die InitData-Methode wird sich um die Datenabholung kümmern, also das XML-File einlesen.

Private Sub InitData()
    _oDataSet = New DataSet("CDCollection")
    _oDataSet.ReadXml(_sPathToDataXmlFile)

    _oDataTable = _oDataSet.Tables(0)
End Sub

Wenn Sie bisher unter .Net noch keine Erfahrung mit XML gemacht haben, kommt hier vielleicht die erste Überraschung. Um die Daten aus einem XML-File zu lesen bedarf es lediglich eines Aufrufs. Mit Hilfe der ReadXML-Funktion wird ein komplettes XML-File als Datentabelle innerhalb eines DataSets (sozusagen ein Sammelbehälter für Datentabellen) angelegt. Mit der Zuweisung _oDataTable = _oDataSet.Tables(0) wird diese eben automatisch eingefügte Datentabelle gleich für den klassenweite Zugriff transparent gemacht.

Nun haben wir also das komplette XML-File strukturiert in einer Datentabelle vorliegen.

3. Das Formular. Um die Informationen anzuzeigen, müssen wir natürlich ein Formular entwerfen. Hierzu benennen wir das im Projekt schon initial vorhandene Form1 in fMain um und platzieren drei Textboxen darauf die wir txtInternalNumber, txtTitle und txtInterpret nennen.

4. Datenbindung. Die Felder selber nützen uns natürlich nur etwas, wenn das Formular (genauer die Textboxen in dem Formular) eine Verbindung zu den in Punkt 2 bereitgestellten Daten herstellen können. Das geschieht über die Datenbindung.
Um ein Control an eine Datenquelle zu binden, bedarf es einem DataBinding welches dem Control mittels einer Add-Methode angefügt wird. Innerhalb der Zuweisung muss dann nur noch definiert werden, welche Eigenschaft des Controls an welches Feld aus welcher Datenquelle gebunden wird. In den meisten Fällen (wie auch in dem hier vorliegenden) wird eine Datenbindung wohl auf die „Text“-Eigenschaft eines Controls festegelegt.

Binden wir nun unsere drei Controls und beginnen mit der InternalNumber. Hier weisen wir der Text-Eigenschaft (also der angezeigte Inhalt) des Control txtInternalNumber das Feld „InternalNumber“ aus unserem XML-File, welches nun als Datentabelle in der Klassenvariablen _oDataTable liegt, zu.
In .Net sieht das dann so aus:

txtInternalNumber.DataBindings.Add("Text", _oDataTable, "InternalNumber")

Recht übersichtlich, oder ? Ebenso verfahren wir mit den anderen beiden Controls und packen das ganze in eine eigene Funktion die wir wiederum in der Form_Load-Methode nach InitData aufrufen.

Private Sub DataBind()
    txtInternalNumber.DataBindings.Add("Text", _oDataTable, "InternalNumber")
    txtTitle.DataBindings.Add("Text", _oDataTable, "Title")
    txtInterpret.DataBindings.Add("Text", _oDataTable, "Interpret")
End Sub

Weiter gehts in Teil 2 in ein paar Tagen. Da gibt es dann auch das gesamte Projekt zum Download.