Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

6. diel - Úvod do XML a zápis Saxe

V predchádzajúcom kvíze, Kvíz - Výnimky, text. súbory, formát CSV vo VB.NET Súbory, sme si overili nadobudnuté skúsenosti z predchádzajúcich lekcií.

Dnes sa zameriame na formát XML, najprv si ho popíšeme, potom si ukážeme triedy, ktoré nám .NET framework poskytuje k jeho čítania a zápisu. Zápis si vyskúšame dnes, čítanie nabudúce.

Formát XML

Teraz vás zahrniem množstvom pojmov, keď niečomu nebudete rozumieť, vôbec to navádza, všetko si tu ešte preberieme :)

XML (eXtensible Markup Language) je značkovací jazyk, ktorý vyvinulo W3C (organizácia, ktorá má na starosti webové štandardy). XML je veľmi univerzálny a je podporované radom jazykov i aplikácií. Slovo extensible (rozšíriteľný) označuje možnosť vytvoriť si pomocou XML vlastný jazyk, tým je napr. XHTML pre tvorbu webových stránok. XML je jazyk samopopisovací, má takú štruktúru, že spoznáme, čo ktorá hodnota označuje. Kým v CSV sa môžeme len domnievať, čo je tá tretia osmička, v XML by nám bolo hneď jasné, že je to počet článkov používateľa (napríklad). Nevýhodou formátu je samozrejme jeho väčšiu veľkosť, čo nám však vo väčšine prípadov nevadí. Osobne takmer vždy pri výbere formátu siaham po XML, hodí sa napr. K uloženiu konfigurácie programu, hiscore hráčov hry alebo k menšej databázu užívateľov. Vďaka XSD schémam ho môžeme jednoducho zvalidovat a predísť chybám pri behu programu.

XML je možné spracovávať hneď niekoľkými spôsobmi. Obvykle jednoduchým kontinuálnym čítaním / zápisom alebo pomocou objektovej štruktúry DOM. Došlo to tak ďaleko, že nám niektoré nástroje (vrátane .NET) umožňujú s XML dokumentom pracovať ako s databázou a volať nad ním SQL dotazy. Asi si dokážete predstaviť, že to uľahčí prácu. Ďalším jazykom k dopytovania sa nad XML súbory je napr. XPath.

XML konkuruje jednoduchšie, ale menej vymáhateľný JSON. Ten na rozdiel od XML umožňuje jednoduché logovanie na koniec súboru bez načítania celého dokumentu.

XML sa veľmi často používa na výmenu dát medzi rozdielnymi systémami (napr. Desktopovú aplikácií a webovou aplikáciou na serveri), preto ako už bolo spomenuté existuje pre neho mnoho knižníc a každý nástroj ho pozná a vie s ním pracovať. S tým súvisia webové služby, SOAP a podobne, čím sa však teraz nebudeme zaoberať.

Minule sme si uložili zoznam používateľov do súboru CSV. Ukladalo sa meno, vek a dátum registrácie. Hodnoty boli zaradom, oddelené bodkočiarkami. Každý riadok predstavoval jedného používateľa. Obsah súboru vyzeral teda asi takto:

Pavel Slavík;22;21.3.2000
Jan Novák;31;30.10.2012

Nezainteresovaný z toho nič moc nespozná, že? Urobme si teraz ekvivalent súboru vo formáte XML:

<?xml version="1.0" encoding="UTF-8" ?>
<uzivatele>
    <uzivatel vek="22">
        <jmeno>Pavel Slavík</jmeno>
        <registrovan>21.3.2000</registrovan>
    </uzivatel>
    <uzivatel vek="22">
        <jmeno>Jan Novák</jmeno>
        <registrovan>30.10.2012</registrovan>
    </uzivatel>
</uzivatele>

Teraz každý vidí, čo je v súbore uložené. Vek som tu uložil ako atribút len preto, aby som ukázal, že je XML vie, inak by mohol byť ako element spolu s menom a registrovaný. Teraz som teda vyzradil, že jednotlivým prvkom sa hovorí elementy. Tie určite všetci poznáte z HTML, ktoré vychádza z rovnakých základov ako XML. Elementy sú väčšinou párové, teda otváracia, potom nasleduje hodnota a uzatváracie s lomkou. Elementy môžu obsahovať ďalšie elementy, štruktúra je teda stromová. Vďaka tomu nie je problém do jediného XML dokumentu uložiť celú hierarchiu objektov. Na začiatku súboru je XML hlavička. Aby bol dokument validný, musí obsahovať práve 1 koreňový element, tu element uzivatele, v ktorom sú zabalené ďalšie elementy. Atribúty sa píšu za názov atribútu do úvodzoviek.

Určite vidíme, že súbor nám nabobtnal, to je daň za to, že vyzerá pekne. Keby nemal užívateľ atribúty len 3, ale napr. 30, bolo by vidieť, ako CSV formát prestáva stačiť. Osobne sa s pribúdajúcimi skúsenosťami čoraz viac prikláňam k riešeniam, ktoré sú prehľadná a jednoduchá, aj keď napríklad zaberajú viac pamäte (a to nielen v súboroch, ale aj v zdrojovom kóde). Nič nie je horšie, ako keď programátor príde za rok k svojmu programu a vôbec nevie, čo je ten ôsmy parameter v CSV, kde je na riadku 100 nejakých čísel. Alebo čo je to pětirozměrné pole, ktoré je síce hrozne rýchle, ale keby si namiesto neho postavil objektovú štruktúru, nemusel by teraz písať program odznovu. Ale to som odbočil.

Xml v .NET

Budeme sa tu venovať dvoch základným prístupom vo XML. Kontinuálnemu prístupu (tzv. SAX parser) a prístupu objektovému (DOM). Dnešné a budúci diel je věnovám SAXUM, ďalších domov. Opäť máme v .NET frameworku viac spôsobov, ako s XML pracovať, niektoré sú zastarané a prítomné len z dôvodu spätnej kompatibility. Strávil som nad XML pomerne dosť času, aby som sem spísal len tie aktuálne a jednoduchej konštrukcie.

Parsovanie XML cez SAX

SAX (ako Simple API for XML) je vlastne jednoduchá nadstavba čítačky textových súborov. Zápis je pomerne jednoduchý, postupne zapisujeme elementy a atribúty tak, ako idú v súbore zaradom. Stromovú štruktúru tu teda ignorujeme. .NET nám poskytuje triedu XmlWriter, ktorá nás odtieňuje od toho, že je XML textový súbor. Pracujeme iba s elementmi (presnejšie uzly, viac ďalej).

Čítanie prebieha podobne, ako zápis. XML teda čítame ako textový súbor, riadok po riadku, zhora nadol. SAX nám však nedáva riadky, ale postupne tzv. Uzly (XMLNode), na ktoré pri čítaní postupne naráža. Uzol môže byť element, atribút alebo hodnota. V cykle uzly dostávame tak, ako idú v súbore zaradom. Na čítanie použijeme triedu XmlReader. Obe triedy sú v mennom priestore System.Xml.

Výhodou SAX je vysoká rýchlosť a pamäťová nenáročnosť. Nevýhody spoznáme, až tento prístup porovnáme s objektovým prístupom DOM.

Zápis XML

Poďme si vytvoriť jednoduché XML, využijeme na to vyššie uvedený príklad s užívateľmi. S triedou Uzivatel sme pracovali už minule, pre istotu ju tu ešte raz priložím. Vytvorte si nový projekt - konzolovú aplikáciu menom XmlSaxZapis a triedu k projektu pridajte:

Public Class Uzivatel
    Private _jmeno As String
    Public Property Jmeno As String
        Get
            Return _jmeno
        End Get
        Private Set(ByVal value As String)
            _jmeno = value
        End Set
    End Property

    Private _vek As Integer
    Public Property Vek As Integer
        Get
            Return _vek
        End Get
        Set(ByVal value As Integer)
            _vek = value
        End Set
    End Property

    Private _registrovan As DateTime
    Public Property Registrovan As DateTime
        Get
            Return _registrovan
        End Get
        Set(ByVal value As DateTime)
            _registrovan = value
        End Set
    End Property

    Public Sub New(jmeno As String, vek As Integer, registrovan As DateTime)
        Me.Jmeno = jmeno
        Me.Vek = vek
        Me.Registrrovan = registrovan
    End Sub

    Public Overrides Function ToString() As String
        Return Me.Jmeno
    End Function
End Class

Kód budeme pre jednoduchosť písať do metódy Main, iba si vyskúšame funkčnosť SAXUM. Z minulých dielov viete, ako sa aplikácia píšu správne objektovo.

Do Imports pridajme System.Xml. XmlWriter vytvárame pomocou továrenské (statické) metódy Create. Ide to aj inak, ale tento spôsob je najvýhodnejší. Objekt bude opäť obalený v bloku using. Do XML môžeme uložiť samozrejme i len 1 objekt (napr. Nastavenie), my si tu ukážeme uloženie zoznamu niekoľkých objektov. Ak budete chcieť uložiť objekt len jeden, bude úprava už hračkou :)

Ako prvý si vytvoríme testovací list používateľov:

Dim uzivatele As New List(Of Uzivatel)
uzivatele.Add(New Uzivatel("Pavel Slavík", 22, New DateTime(2000, 3, 21)))
uzivatele.Add(New Uzivatel("Jan Novák", 31, New DateTime(2012, 10, 30)))
uzivatele.Add(New Uzivatel("Tomáš Marný", 16, New DateTime(2011, 1, 12)))

Už máme čo zapisovať. Budeme chcieť, aby bol XML výstup pekne naformátovaný a odsadený podľa stromovej štruktúry. Toto nastavenie bohužiaľ nie je defaultný a preto ho musíme vynútiť odovzdaním inštancie triedy XmlWriterSettings. Tej nastavíme vlastnosť indent (ponoriť) na true:

Dim nastaveni As New XmlWriterSettings()
nastaveni.Indent = True

Hotovo. Teraz vytvoríme inštanciu triedy XmlWriter pomocou továrenské metódy Create. Budeme pracovať v bloku using. Inštanciu ako parametre odovzdáme cestu k súboru a nastavenie:

Using xw As XmlWriter = XmlWriter.Create("soubor.txt", nastaveni)

End Using

Poďme sa pustiť do samotného zápisu. Najprv zapíšeme hlavičku dokumentu:

xw.WriteStartDocument()

Ďalej (ako už vieme) musí nasledovať koreňový element, v ktorom je celý zvyšok XML obsiahnutý. K zapisovanie elementov máme metódy WriteStartElement a WriteEndElement. Prvý berie v atribúte názov elementu, ktorý otvárame. Druhá metóda spozná názov otvoreného elementu sama z kontextu dokumentu a parametre teda nemá. Otvorme koreňový element, v našom prípade element uzivatele:

xw.WriteStartElement("uzivatele")

Teraz sa dostávame k zápisu jednotlivých užívateľov, ten bude teda prítomný vo foreach cyklu.

Zápis hodnoty do elementu prevedieme pomocou metódy WriteValue, parametrom je zapisovaná hodnota. Obdobne môžeme elementu pridať atribút metódou WriteAttributeS­tring, ktorej parametre sú názov atribútu a jeho hodnota. Hodnota je vždy typu String. Cyklus a zápis elementu užívateľ (zatiaľ ešte bez vnorených elementov) bude teda vyzerať takto:

For Each u As Uzivatel In uzivatele
    xw.WriteStartElement("uzivatel")
    xw.WriteAttributeString("vek", u.Vek)
    xw.WriteEndElement()
Next

Do programu pripíšeme ešte jeden EndElement k uzavretiu koreňového elementu a EndDocument k ukončeniu celého dokumentu. Podobne ako u textových súborov musíme aj tu vyprázdniť buffer metódou Flush. Celý kód programu teda teraz vyzerá takto:

'testovací kolekce uživatelů
Dim uzivatele As New List(Of Uzivatel)
uzivatele.Add(New Uzivatel("Pavel Slavík", 22, New DateTime(2000, 3, 21)))
uzivatele.Add(New Uzivatel("Jan Novák", 31, New DateTime(2012, 10, 30)))
uzivatele.Add(New Uzivatel("Tomáš Marný", 16, New DateTime(2011, 1, 12)))

'nastavení XmlWriteru
Dim nastaveni As New XmlWriterSettings()
nastaveni.Indent = True

'zápis uživatelů
Using xw As XmlWriter = XmlWriter.Create("soubor.xml", nastaveni)
    xw.WriteStartDocument() 'hlavička
    xw.WriteStartElement("uzivatele") 'otevření kořenového elementu uzivatele

    'zápis jednotlivých uživatelů
    For Each u As Uzivatel In uzivatele
        xw.WriteStartElement("uzivatel")
        xw.WriteAttributeString("vek", u.Vek)
        xw.WriteEndElement()
    Next

    xw.WriteEndElement() 'uzavření koncového elementu
    xw.WriteEndDocument() 'konec dokumentu
    xw.Flush()
End Using

Program si skúsime spustiť a uistíme sa, že všetko funguje. Výstup programu by mal vyzerať takto (zložka s programom / bin / debug / soubor.xml):

<?xml version="1.0" encoding="utf-8"?>
<uzivatele>
  <uzivatel vek="22" />
  <uzivatel vek="31" />
  <uzivatel vek="16" />
</uzivatele>

Vidíme, že SAX spoznal, že v elemente uzivatel nie je okrem atribútu žiadna hodnota a tak tag vyrenderoval ako nepárový. Teraz vložíme do elementu uzivatel 2 ďalšie elementy, presnejšie jeho vlastnosti meno a dátum registrácie:

xw.WriteStartElement("jmeno")
xw.WriteValue(u.Jmeno)
xw.WriteEndElement()
xw.WriteStartElement("registrovan")
xw.WriteValue(u.Registrovan.ToShortDateString())
xw.WriteEndElement()

Ani jeden element v sebe neobsahuje ďalšie elementy ani atribúty. Takého elementy len s textovou hodnotou môžeme zapísať s pomocou jedinej metódy WriteElementString, ktorej atribúty sú názov elementu a hodnota, ktorú má obsahovať:

xw.WriteElementString("jmeno", u.Jmeno)
xw.WriteElementString("registrovan", u.Registrovan.ToShortDateString())

Oba zápisy sú teda ekvivalentné.

Ten kratšie vložíme do miesta zápisu elementu uzivatel, teda medzi jeho StartElement a EndElement. Pre istotu si ešte uveďme kompletný kód časti s cyklom:

For Each u As Uzivatel In uzivatele
    xw.WriteStartElement("uzivatel")
    xw.WriteAttributeString("vek", u.Vek)

    xw.WriteStartElement("jmeno")
    xw.WriteValue(u.Jmeno)

    xw.WriteStartElement("registrovan")
    xw.WriteValue(u.Registrovan.ToShortDateString())
    xw.WriteEndElement()
Next

A máme hotovo. Hotový program je ako vždy k stiahnutiu pod článkom.

Nabudúce, Čítanie XML Saxe v VB.NET , budeme cez SAX XML čítať.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 194x (64.78 kB)
Aplikácia je vrátane zdrojových kódov v jazyku VB

 

Predchádzajúci článok
Kvíz - Výnimky, text. súbory, formát CSV vo VB.NET Súbory
Všetky články v sekcii
Súbory a sieť vo Visual Basic .NET
Preskočiť článok
(neodporúčame)
Čítanie XML Saxe v VB.NET
Článok pre vás napísal Michal Žůrek - misaz
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje tvorbě aplikací pro počítače, mobilní telefony, mikroprocesory a tvorbě webových stránek a webových aplikací. Nejraději programuje ve Visual Basicu a TypeScript. Ovládá HTML, CSS, JavaScript, TypeScript, C# a Visual Basic.
Aktivity