Postoje uglavnom dva načina čitanja XML-a sa C#: korišćenjem klase XmlDocument ili klase XmlReader.

XmlDocument čita ceo XML sadržaj u memoriju, a zatim vam omogućava da se krećete napred-nazad po njemu kako želite, ili čak da pretražujete dokument koristeći XPath tehnologiju.

XmlReader je brža alternativa za koju je potrebno manje memorije. Omogućava prolazak kroz XML sadržaj jedan po element, pa kada pogledate vrednost, prelazite na sledeći element. Kada se radi na takav način to znači da se očito koristi malo memorije jer drži samo trenutni element, a pošto morate ručno proveriti vrednosti, dobićete samo relevantne elemente, što ga čini vrlo brzim.

Primer: pročitati XML dokument koji sadrži trenutne kurseve za valute, a taj fajl možemo uzeti sa stranice Evropske centralne banke. Mogli bismo ga preuzeti i čitati sa diska, ali zapravo, i klase XmlReader i XmlDocument mogu čitati XML sa udaljenog URL-a isto kao i iz lokalne datoteke. Link ka XML fajlu:  ( http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml) .

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();
        }
    }
}
Počinjemo kreiranjem XmlReader instance, koristeći statičku Create() metodu. Ima nekoliko preopterećenja, ali najjednostavniji od njih samo uzima URL koji upućuje na datoteku. U petlji while pozivamo metodu Read() na instanci XmlReader. Zatim se reader prebacuje na sledeći element, i vraća true sve dok ima nešto za čitanje. Unutar petlje sada možemo koristiti jedno od mnogih svojstava i metoda na XmlReader-u za pristup podacima iz trenutnog elementa.

U našem slučaju, provjeravamo NodeType da vidimo da li imamo element (dio oznake) i da li je ime "Cube". Kao što možete videti u XML dokumentu koji smo koristili, svaki kurs valute je unutar elementa koji se zove Cube, tako da je ovo, naravno, ono što tražimo - ostalo se zanemaruje. Kada imamo element Cube, vršimo formalnu proveru da vidimo da li ima atribute (što bi trebao), a zatim koristimo metodu GetAttribute() da pročitamo dve vrednosti atributa "currency" i "rate". Ispisujemo ih na konzoli i onda prelazimo na sledeći element. Rezultat bi trebao biti kompletna lista valuta i njihov trenutni kurs.

opciono - za one koji žele da znaju više (za bolje učenike):

Čitanje XML-a pomoću XmlDocument-a

XmlDocument koristii više memorije i možda je malo sporiji od XmlReader-a. Međutim, za mnoge svrhe, XmlDocument može biti lakši za rad i često zahteva manje koda. Kada je XML sadržaj pročitan, možete čitati podatke na hijerarhijski način, baš kao i XML strukturu, sa root elementom koji može imati podređene elemente, koji takođe mogu imati podređene elemente, itd. U prethodnom tekstu smo analizirali XML podatke Evropske centralne banke o trenutnim kursevima valuta, a to ćemo učiniti i sada, ali koristeći klasu XmlDocument:

XML fajl izgleda otprilike ovako:

<gesmes:Envelope>
    [other child nodes]
    <Cube>
<Cube time="2011-04-12">
    <Cube currency="USD" rate="1.4470"/>
    <Cube currency="JPY" rate="121.87"/>
    …
Root elemenat je gesmes:Envelope , i možemo da mu pristupimo pomoću propertija DocumentElement.  Nakon toga ćemo moći pristupiti podređenim čvorovima (deci ovog čvora) koristeći sledeće svojstvo: kolekciju ChildNodes. U našem primeru, želimo podređene čvorove tri nivoa ispod elementa root/document. To možemo učiniti pomoću sledećeg koda, koji u suštini radi isto što i kod baziran na XmlReader-u od ranije:

using System;
using System.Text;
using System.Xml;

namespace ParsingXml
{
    class Program
    {
static void Main(string[] args)
{
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load("http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml");
    foreach(XmlNode xmlNode in xmlDoc.DocumentElement.ChildNodes[2].ChildNodes[0].ChildNodes)
Console.WriteLine(xmlNode.Attributes["currency"].Value + ": " + xmlNode.Attributes["rate"].Value);
    Console.ReadKey();
}
    }
}
U ovom primeru pristupamo čvorovima Cube tako što idemo niz ChildNodes hijerarhiju. Od DocumentElementa (root element) tražimo treći podređeni čvor (zasnovan na nultom indeksu), zatim tražimo prvi podređeni čvor toga, a zatim tražimo celu kolekciju podređenih čvorova. Očigledno je to moguće samo zato što znamo strukturu XML dokumenta, i definitivno niti je previše fleksibilna, niti ju je lako kasnije promeniti. Međutim, način na koji se krećete po XML dokumentu uvelike ovisi o XML izvoru i podacima koji su vam potrebni.

Onoga momenta kada imamo čvor sa kursom valute, pristupamo dvoma svojstvima koja nas zanimaju i zatim ih šaljemo na konzolu, baš kao i u prethodnom primeru.



izvori:

https://csharp.net-tutorials.com/xml/reading-xml-with-the-xmlreader-class/

https://csharp.net-tutorials.com/xml/reading-xml-with-the-xmldocument-class/

Last modified: Friday, 21 January 2022, 4:58 PM