XML-Verarbeitung: Dateien lesen

Um eine XML-Datei einzulesen und zu verarbeiten, gibt es die Klasse XmlReader im Namensraum System.Xml. Ein Objekt der Klasse wird normalerweise nicht über den Konstruktor, sondern über die statische Funktion Create() erzeugt. Der Funktion wird als Parameter der Dateiname übergeben. Ein XmlReader ist ebenfalls ein Stream, weshalb dieser am Ende mit Close() geschlossen werden sollte.
Mit der Funktion Read() wird ein sogenannter Knoten eingelesen. Dabei kann es sich um ein Element, ein Kommentar, einen Text oder anderes handeln. Hierbei arbeitet die Read()-Funktion das XML-Dokument an Hand der Baumstruktur ab. Nun können über verschiedene Eigenschaften Informationen über den aktuellen Knoten abgerufen werden. Die Eigenschaft NodeType gibt einen Wert der Enumeration XmlNodeType zurück, welcher angibt, um was für eine Art von Knoten es sich handelt (z. B. Element, Comment und Text). Die Eigenschaft Name gibt den Namen des aktuellen Knotens zurück. Bei Elementen ist dies also der Elementname, bei Attributen der Name des Attributs usw.. Über die Eigenschaft Value können wir den aktuellen Wert abrufen, dieser enthält bei Attributen den Attribut-Wert, einen Kommentar oder auch einen Text. Über die Eigenschaft Depth können wir die aktuelle Tiefe der Baumstruktur ermitteln. Attribute können nicht über die Read()-Funktion eingelesen werden, jedoch können wir, wenn wir ein Element eingelesen haben über die Eigenschaft HasAttributes ermitteln, ob das Element Attribute enthält. Ist dies der Fall, so können wir diese mit der Funktion MoveToNextAttribute() auslesen.

Program.cs

XmlReader oXmlReader = null;

try
{
	oXmlReader = XmlReader.Create("test.xml");

	while (oXmlReader.Read())
	{
		// Einrückung um 2 Leerzeichen pro Baumstruktur-Tiefe
		for (int i = 0; i < oXmlReader.Depth; i++)
			Console.Write("  ");

		// Unterscheiden, anhand des XML-Typs (Element, Attribut etc.)
		switch (oXmlReader.NodeType)
		{
			case XmlNodeType.Element:
				Console.WriteLine("Element (Tag) \"{0}\"", oXmlReader.Name);
				// Prüfen ob Element Attribute hat
				if (oXmlReader.HasAttributes)
				{
					while (oXmlReader.MoveToNextAttribute())
					{
						// Einrückung um 2 Leerzeichen pro Baumstruktur-Tiefe
						for (int i = 0; i < oXmlReader.Depth; i++)
							Console.Write("  ");

						// Informationen über das Attribut ausgeben
						Console.WriteLine("Attribut \"{0}\" = \"{1}\"", oXmlReader.Name, oXmlReader.Value);
					}
				}
				break;
			case XmlNodeType.EndElement:
				Console.WriteLine("Element-Ende (Tag) \"{0}\"", oXmlReader.Name);
				break;
			case XmlNodeType.Comment:
				Console.WriteLine("Kommentar \"{0}\"", oXmlReader.Value);
				break;
			case XmlNodeType.Text:
				Console.WriteLine("Text \"{0}\"", oXmlReader.Value);
				break;
			default:
				// Wichtig: Cursor wird um die Anzahl an aufgefüllten Leerzeichen zurückgesetzt, wenn keine Ausgabe erfolgen soll
				Console.SetCursorPosition(Console.CursorLeft - (oXmlReader.Depth * 2), Console.CursorTop);
				break;
		}
	}
}
catch (Exception ex)
{
	Console.WriteLine(ex.ToString());
}
finally
{
	if (oXmlReader != null)
		oXmlReader.Close();
}

Console.ReadKey();

test.xml
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>

<datenbank>
  <stadt stadtstaat="ja">
    <name>Berlin</name>
    <bundesland>Berlin</bundesland>
	<flaeche>891,85 km²</flaeche>
	<einwohnerzahl>3.543.676</einwohnerzahl>
  </stadt>
  <stadt landeshauptstadt="ja">
    <name>München</name>
    <bundesland>Bayern</bundesland>
	<flaeche>310,43 km²</flaeche>
	<einwohnerzahl>1.378.176</einwohnerzahl>
  </stadt>
  <stadt stadtstaat="ja">
    <name>Hamburg</name>
    <bundesland>Hamburg</bundesland>
	<flaeche>755,26 km²</flaeche>
	<einwohnerzahl>1.813.587</einwohnerzahl>
  </stadt>
  <!-- Frankfurt am Main ist nicht die Landeshauptstadt! -->
  <stadt landeshauptstadt="nein">
    <name>Frankfurt am Main</name>
    <bundesland>Hessen</bundesland>
	<flaeche>248,31 km²</flaeche>
	<einwohnerzahl>691.518</einwohnerzahl>
  </stadt>
  <stadt landeshauptstadt="nein">
    <name>Köln</name>
    <bundesland>Nordrhein-Westfalen</bundesland>
	<flaeche>405,17 km²</flaeche>
	<einwohnerzahl>1.017.155</einwohnerzahl>
  </stadt>
</datenbank>
Download

LinksRechts