This article has been localized into Polish by the community.
Odczytywanie XML za pomocą klasy XmlReader
Istnieją dwa sposoby na odczytywanie plików XML z wykorzystaniem języka C#: za pomoca klasy XmlDocument oraz klasy XmlReader. XmlDocument wczytuje całą treść XML do pamięci, a następnie umożliwia tobie na nawigowanie po jego zawartości wedle twojego uznania. Umożliwia także skorzystanie kwerend z udziałem technologii XPath.
XmlReader jest szybszą i mniej pamięcio-żerną alternatywą. Umożliwia tobie na przeglądanie zawartości dokumentu XML po jednym elemencie w danym momencie, tak byś mógł sprawdzić wartość, a następnie przeskakuje do następnego elementu. Dzięki temu ta metoda nie potrzebuje dużej ilości pamięci. W danym momenicie tylko jeden element jest w niej przechowywany. A że na dodatek sam musisz sprawdzić wartość elementu, praca odbywa się tylko na istotnych elementach. W tym rozdziale skupimy się na klasie XmlReader, przechodząc do klasy XmlDocument w następnym rozdziale.
Przejdzmy może do przykładu, gdzie wczytamy dokument XML zawierający stopy walut. Tak się składa, że Europejski Bank Centralny przygotował już jeden za nas. Możemy go pobrać i wczytać z dysku twardego, jednak obie klasy XmlReader i XmlDocument są w stanie wczytywać pliki XML ze zdalnych adresów URL jak i zasobów lokalnych. Sam plik XML znajduje się pod podanym linkiem http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml. A poniżej znajduje się przykładowy kod z objaśnieniem jego działania:
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();
}
}
}
Zaczynamy od utworzenia instancji XmlReader, korzystając ze statycznej metody Create(). Warto zaznaczyć że jest to metoda przeładowana, jednak najprostsza z jej wersji wymaga najzwyklejszego adresu URL wskazującego na plik. W pętli while wywołujemy metodę Read() utworzonej przez nas instancji. Przeskakuje ona po następujących po sobie elementach i zwraca wartość true, tak długo jak długo istnieje zawartość do odczytu. Od tego momentu możemy wykorzystać wewnątrz pętli różne metody oraz właściwości klasy XmlReader, aby pracować nad danymi danego elementu.
W naszym przypadku sprawdzamy czy dla naszego NodeType istnieje zawarty w nim znacznik Element, oraz czy jego nazwa to "Cube". Jak sam możesz sprawdzić, w wykorzystanym przez nas pliku XML każda stopa walutowa jest zawarta w elemencie o nazwie Cube. Jako że jest to szukana przez nas wartość, reszta znaczników zostajnie pominięta. Po otrzymaniu elementu Cube, dla formalności sprawdzamy czy zawiera on atrybuty (a powinien), a następnie korzystamy z metody GetAttribute() dla odczytanie wartości atrybutów "currency" i "rate". Wypisujemy je w konsoli i przechodzimy do następnego elementu. Rozultatem powinna być kompletna lista walut z ich aktualnym kursem wymiany.
Jak więc sam widzisz nie ma w tym nic trudnego, jednak głównie dzięki temu że wymagane przez nas dane są przetwarzane, w tej samej kolejności w jakiej je otrzymujemy. W następnym rozdziale zrobimy dokładnie to samo jednak korzystając z klasy XmlDocument, tak abyś mógł poznać różnicę między tymi dwiema metodami.
Uwaga: Powinieneś zdawać sobie sprawę, że istnieje wiele powodów dla których powyższy kod by nas zawiódł i wyrzucił by wyjątek, czym rzecz jasna musiał byś się osobiście zająć. Dodatkowe informacje znajdziesz w rozdziale poświęconym wyjątkom.