This article has been localized into German by the community.
XML mit der XmlReader-Klasse einlesen
Es gibt grundsätzlich zwei Methoden, um XML mit C# zu lesen: die XmlDocument Klasse und die XmlReader Klasse. XmlDocument liest den kompletten XML Inhalt in den Speicher und ermöglicht es dir, im Dokument vorwärts oder rückwärts zu navigieren oder mit der XPath Technik sogar innerhalb des Dokuments abzufragen.
Der XmlReader ist die schnellere Alternative und verbraucht auch weniger Speicher. Du kannst damit den XML Inhalt Element für Element durchgehen, seinen Wert prüfen, und dann zum nächsten Element weitergehen. Auf diese Art verbraucht der XmlReader sehr wenig Speicher, da er nur das aktuelle Element im Speicher behält und du außerdem selbst die Werte prüfen musst. Du bekommst nur die relevanten Elemente, und das macht ihn sehr schnell. In diesem Kapitel befassen wir uns mit der XmlReader Klasse, die XmlDocument Klasse wird dann im nächsten Kapitel behandelt.
Versuchen wir ein kleines Beispiel, in dem wir ein XML Dokument mit den aktuellen Wechselkursen lesen. Glücklicherweise hat die Europäische Zentralbank (EZB) eines, das wir verwenden können. Wir könnten es herunterladen und von der Festplatte lesen, doch tatsächlich kann sowohl die XmlReader als auch die XmlDocument Klasse XML genauso gut von einer Webadresse wie von einer lokalen Datei lesen. Hier kannst du das XML sehen ( http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml) und hier kommt der Code und im folgenden die Erklärung dazu:
using System;
using System.Text;
using System.Xml;
namespace ParsingXml
{
class Program
{
static void Main(string[] args)
{
XmlReader xmlReader = XmlReader.Create("http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml");
while(xmlReader.Read())
{
if((xmlReader.NodeType == XmlNodeType.Element) && (xmlReader.Name == "Cube"))
{
if(xmlReader.HasAttributes)
Console.WriteLine(xmlReader.GetAttribute("currency") + ": " + xmlReader.GetAttribute("rate"));
}
}
Console.ReadKey();
}
}
}
Wir starten, indem wir mit der statischen Create() Methode eine XmlReader Instanz erzeugen. Sie hat mehrere Überladungen, aber die einfachste von ihnen benötigt nur eine URL, die auf die Datei verweist. In einer while-Schleife rufen wir die Read() Methode der XmlReader Instanz auf. Sie lässt den reader zum nächsten Element springen und gibt wahr (true) zurück, solange es noch Daten zu lesen gibt. Innerhalb der Schleife können wir nun eine der vielen Eigenschaften und Methoden des Elements im XmlReader verwenden, um an die Daten des aktuellen Elements zu kommen.
In unserem Fall überprüfen wir den NodeType, um zu sehen, ob wir ein Element (den Tag-Teil) haben, und ob der Name "Cube" ist. Wie du im XML-Dokument, welches wir benutzt haben, sehen kannst, ist jeder Wechselkurs(currency rate) in einem Element namens Cube, also ist das auf jeden Fall was wir suchen - der Rest wird ignoriert. Haben wir ein Cube Element, überprüfen wir formell, ob es Attribute hat (was es sollte) und dann benutzen wir die GetAttribute() Methode, um die zwei Attributwerte "currency" und "rate" zu lesen. Wir geben sie in der Konsole aus und gehen dann zum nächsten Element. Das Ergebnis sollte eine komplette Liste von Währungen und deren momentaner Wechselkurse.
Wie du sehen kannst, ist es ziemlich einfach, aber hauptsächlich, weil wir nur die Daten in derselben Reihenfolge, in der sie gelesen werden, brauchen, ohne damit irgendetwas ausgefallenes zu machen. Im nächsten Kapitel werden wir dasselbe tun, allerdings die XmlDocument Klasse nutzend, sodass du den Unterschied sehen kannst.
Anmerkung: Du solltest dir im Klaren sein, dass es viele Wege gibt, wie der Code oben fehlschlagen und eine Ausnahme ausgeben könnte. Sieh dir das Kapitel über Ausnahmen für weitere Informationen an.