TOC

This article has been localized into Polish by the community.

XML:

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.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!