TOC

This article has been localized into Czech by the community.

XML:

Čtení XML s třídou XmlReader

Pro čtení XML v C# se převážně používají dvě metody: třída XmlDocument a třída XmlReader. XmlDocument načte celý obsah XML do paměti a poté vám umožní v dokumentu navigovat tam a zpátky, jak chcete, nebo dokonce dotazovat dokument pomocí technologie XPath.

XmlReader je rychlejší a méně paměťově náročná alternativa. Umožňuje vám procházet obsah XML jeden prvek po druhém, přičemž vám umožňuje prohlížet hodnotu a poté přejít na další prvek. Tímto způsobem samozřejmě spotřebovává velmi málo paměti, protože drží pouze aktuální prvek, a protože musíte manuálně kontrolovat hodnoty, získáte pouze relevantní prvky, což to činí velmi rychlým. V této kapitole se zaměříme na třídu XmlReader a v další kapitole přejdeme na třídu XmlDocument.

Vyzkoušejme malý příklad, kde čteme XML dokument obsahující kurzy měn. Naštěstí pro nás má Evropská centrální banka jeden, který můžeme použít. Mohli bychom si jej stáhnout a číst z pevného disku, ale ve skutečnosti mohou třídy XmlReader i XmlDocument číst XML stejně dobře z vzdálené URL jako z lokálního souboru. XML můžete vidět zde ( http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml) a zde přichází nějaký kód a poté vysvětlení:

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();
        }
    }
}

Začínáme vytvořením instance XmlReader pomocí statické metody Create(). Má několik přetížení, ale to nejjednodušší jen bere URL odkazující na soubor. Ve while smyčce voláme metodu Read() na instanci XmlReader. Posune čtečku na další prvek a poté vrací true, dokud je co číst. Uvnitř smyčky můžeme nyní použít jednu z mnoha vlastností a metod na XmlReader k přístupu k datům z aktuálního prvku.

V našem případě kontrolujeme NodeType, abychom zjistili, zda máme Element (část tagu) a zda je název "Cube". Jak můžete vidět v XML dokumentu, který jsme použili, každý kurz měny je uvnitř prvku nazvaného Cube, takže to je samozřejmě to, co hledáme - zbytek je ignorován. Jakmile máme prvek Cube, provedeme formální kontrolu, zda má atributy (což by měl) a pak použijeme metodu GetAttribute() ke čtení dvou hodnot atributů "currency" a "rate". Vypíšeme je na konzoli a poté přejdeme na další prvek. Výsledkem by měl být úplný seznam měn a jejich aktuální směnný kurz.

Jak vidíte, je to poměrně jednoduché, ale hlavně proto, že potřebujeme data ve stejném pořadí, v jakém jsou čtena, bez jakýchkoli složitých úprav. V další kapitole uděláme totéž, ale použijeme třídu XmlDocument, abyste viděli rozdíl.

Poznámka: Měli byste si být vědomi, že existuje mnoho způsobů, jak by výše uvedený kód mohl selhat a vyvolat výjimku, kterou byste samozřejmě měli ošetřit. Více informací naleznete v kapitole o výjimkách.


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!