Auf Englisch lesen

Freigeben über


XML-Dateien lesen und schreiben mit VB.NET

Veröffentlicht: 26. Mai 2004 | Aktualisiert: 15. Nov 2004

Von Mathias Schiffer

XML-Dateien sind Textdatenlager vom Feinsten. Dieser MSDN Quickie für Einsteiger zeigt, wie Sie unter Visual Basic .NET Daten in XML-Dateien ablegen und wieder auslesen.

Früher war das Leben einfach: Wer Daten ablegen wollte, tat dies entweder in INI-Dateien oder in proprietären Dateiformaten. Beide Wege hatten Nachteile: INI-Dateien waren extrem unflexibel, größenbeschränkt und sogar inhaltlich problematisch (etwa bei führenden Leerzeichen eines Eintrags).

In einem kurzen Zwischenspiel entstand die Idee, Benutzerdaten zentral in der Windows-Registrierungsdatenbank abzulegen. Die Möglichkeiten schienen verführerisch: Strukturierte Datenbäume, Binärdatenablage, automatische Benutzerabhängigkeit - im Prinzip keine schlechte Idee. Auf der anderen Seite: Windows ist selber so radikal von der Registrierungsdatenbank abhängig, dass eine Überladung Windows ausbremste, fehlerhafte oder fehlende Deinstallationsprogramme Datenmüll nicht aufräumten, uns so weiter: Wer schon früh von der Registry als Datengrab absah, wurde etwas misstrauisch beäugelt, später aber umso frenetischer als Visionär bejubelt.

Eigene Dateiformate waren nicht wesentlich besser: Zum einen blieb ihr Aufbau ein Geheimnis des Entwicklers, zum anderen musste die einmal für ein Format getroffene Entscheidung bei Weiterentwicklung der zugehörigen Software oft genug revidiert werden. Importfilter konnten dann teilweise helfen, arbeiten jedoch im Interesse des Herstellers zumeist nur in Richtung der neueren Software.

Es gibt neben noch viele weitere Gründe, sich statt der vorgestellten Mechanismen für die Datenhaltung kleinerer Datenmengen im XML-Format zu entscheiden. Aber genug zur Motivation, kommen wir endlich zur Technik. Und die ist dank des .NET Framework beeindruckend einfach in den Griff zu bekommen.

Im folgenden Codebeispiel werden zwei einfache Methoden vorgestellt: Die Methode XMLWriter schreibt mithilfe der Framework-Klasse System.Xml.XmlTextWriter ein paar triviale, strukturierte Textdaten in eine Datei "quickie.xml" - zwei kurze Personendatensätze, die von einem Element "Personen" eingefasst sind. Die Methode XMLReader liest diese Datei mithilfe der zugehörigen Klasse System.Xml.XmlTextReader in allgemeiner Weise wieder aus und gibt dann die ausgelesenen Daten in ein Konsolenfenster oder das Debug-Fenster von Visual Studio .NET aus.

Dieses kleine Beispiel kann und soll nur als motivierender Ausgangspunkt für eigene Ausflüge dienen. Beschäftigen Sie sich ruhig ein wenig mit dem Namespace System.Xml: Bei Ihrer Arbeit mit Microsoft .NET Technologien wird er Ihnen zwangsläufig immer wieder "über den Weg laufen".

Private Sub XMLWriter() 
   
 ' Auswahl einer Kodierungsart für die Zeichenablage 
 Dim enc As New System.Text.UnicodeEncoding 
   
 ' XmlTextWriter-Objekt für unsere Ausgabedatei erzeugen: 
 Dim XMLobj As Xml.XmlTextWriter _ 
   = New Xml.XmlTextWriter("quickie.xml", enc) 
   
 With XMLobj 
   
   ' Formatierung: 4er-Einzüge verwenden 
   .Formatting = Xml.Formatting.Indented 
   .Indentation = 4 
   
   ' Dann fangen wir mal an: 
   .WriteStartDocument() 
   
   ' Beginn eines Elements "Personen". Darin werden wir mehrere 
   ' Elemente "Person" unterbringen. 
   .WriteStartElement("Personen") 
   
   ' Hier kommt das erste Element "Person". Eine Person hat 
   ' in unserem einfachen Beispiel einen Titel, einen Nach- 
   ' namen und einen Vornamen. Als Demo soll uns das genügen. 
   .WriteStartElement("Person") ' <Person 
   .WriteAttributeString("Titel", "Dr.") 
   .WriteAttributeString("Name", "Meyer") 
   .WriteAttributeString("Vorname", "Hans") 
   .WriteEndElement() ' Person /> 
   
   ' Hier kommt (noch immer im Element "Personen" das zweite 
   ' Element "Person". 
   .WriteStartElement("Person") ' <Person 
   .WriteAttributeString("Titel", "") 
   .WriteAttributeString("Name", "Schmidt") 
   .WriteAttributeString("Vorname", "Carlos") 
   .WriteEndElement() ' Person /> 
   
   ' Nachdem das Element "Personen" zwei Elemente "Person" 
   ' erhalten hat, beenden wir die Ausgabe für "Personen"... 
   .WriteEndElement() ' </Personen> 
   
   ' ... und schließen das XML-Dokument (und die Datei) 
   .Close() ' Document 
   
 End With 
   
 ' Und so sieht die Ergebnisdatei aus: 
 ' ----------------------------------- 
 '<?xml version="1.0" encoding="utf-16"?> 
 '<Personen> 
 ' <Person Titel="Dr." Name="Meyer" Vorname="Hans" /> 
 ' <Person Titel="" Name="Schmidt" Vorname="Carlos" /> 
 '</Personen> 
   
  End Sub 
   
   
   
  Private Sub XMLReader() 
   
 ' Wir benötigen einen XmlReader für das Auslesen der XML-Datei 
 Dim XMLReader As Xml.XmlReader _ 
   = New Xml.XmlTextReader("quickie.xml") 
   
 ' Es folgt das Auslesen der XML-Datei 
 With XMLReader 
   
   Do While .Read ' Es sind noch Daten vorhanden 
   
  ' Welche Art von Daten liegt an? 
  Select Case .NodeType 
   
 ' Ein Element 
  Case Xml.XmlNodeType.Element 
   
   Console.WriteLine("Es folgt ein Element vom Typ " & .Name) 
   
   ' Alle Attribute (Name-Wert-Paare) abarbeiten 
   If .AttributeCount > 0 Then 
  ' Es sind noch weitere Attribute vorhanden 
  While .MoveToNextAttribute ' nächstes 
 Console.WriteLine("Feldname: " & .Name & _ 
 " -> " & _ 
 "Feldwert: " & .Value) 
  End While 
   
   End If 
   
   ' Ein Text 
 Case Xml.XmlNodeType.Text 
   Console.WriteLine("Es folgt ein Text: " & .Value) 
   
   ' Ein Kommentar 
 Case Xml.XmlNodeType.Comment 
   Console.WriteLine("Es folgt ein Kommentar: " & .Value) 
   
  End Select 
   
   Loop  ' Weiter nach Daten schauen 
   
   .Close()  ' XMLTextReader schließen 
   
 End With 
   
 ' Und so sieht das Ergebnis der Ausgabe aus: 
 ' ------------------------------------------ 
 'Es folgt ein Element vom Typ Personen 
 'Es folgt ein Element vom Typ Person 
 'Feldname: Titel -> Feldwert: Dr. 
 'Feldname: Name -> Feldwert: Meyer 
 'Feldname: Vorname -> Feldwert: Hans 
 'Es folgt ein Element vom Typ Person 
 'Feldname: Titel -> Feldwert: 
 'Feldname: Name -> Feldwert: Schmidt 
 'Feldname: Vorname -> Feldwert: Carlos 
   
  End Sub