Poznáváme C# a Microsoft.NET 43. díl – práce s XML

Po minulém úvodu do jazyka XML a jeho využití v prostředí .NET na toto téma dnes navážeme a kromě rozšíření znalostí o možnostech čtení XML dokumentu pomocí XMLReaderu si ukážeme jak XML dokument programově vytvořit.

Jak na atributy v XML

V minulém díle jsme měli pro naše zkušební účely vytvořen jednoduchý XML dokument, který obsahoval data o zaměstnancích. Jeho obsah byl tvořen pouze elementy. Možné ovšem je údaje o konkrétním zaměstnanci uchovávat v podobě atributů elementů, takže například nějak takto:

/// <summary>
/// Ukazka pouziti XMLReaderu pro precteni
///  obsahu atributu jednotlivych elementu
/// </summary>
public class XMLReaderPriklady
{
  public static void VypisZamestnance()
  {
    XmlReader lReader = new XmlTextReader("C:/zamestnanci.xml");
    try
    {
      while(lReader.Read())
      {
        switch(lReader.NodeType)
        {
          //zajima nas pouze start elementu
          case XmlNodeType.Element :
            //pokud je jmeno elementu zamestnanec a element ma nejake atributy
            if (lReader.Name.Equals("zamestnanec") && lReader.HasAttributes)
            {
              //vypiseme atributy
              Console.WriteLine("Jmeno : {0}", lReader["jmeno"]);
              Console.WriteLine("Prijmeni : {0}", lReader["prijmeni"]);
              Console.WriteLine("Pozice : {0}", lReader["pozice"]);
              Console.WriteLine();
            }
          break;
        }
      }
    }
    finally
    {
      lReader.Close();
    }
  }
}

V zásadě by pro vás po přečtení minulého dílu nemělo být v tomto příkladu moc novinek. Jednoduše se při zpracovávání počátečního tagu uzlu podíváme, zda-li jeho jméno není zamestnanec a pokud ano, tak se ještě pomocí metody HasAttributes ujistíme, jestli element obsahuje nějaké atributy. V případě, že jsou splněny obě výše uvedené podmínky, tak si pomocí vlastnosti Item instance třídy XMLReader, která je pro nás v jazyce C# implementována formou indexeru vyzvedneme hodnoty jednotlivých atributů.

Toto ovšem není jediná cesta, kterou se můžeme vydat ke zjištění názvů a hodnot atributů jednotlivého elementu. XMLReader umožňuje i průchod všemi atributy právě čteného uzlu, jak ukazuje následující příklad.

/// <summary>
/// Ukazka prochazeni atributy cteneho uzlu
/// </summary>
public static void VypsaniAtributu()
{
  XmlReader lReader = new XmlTextReader("C:/zamestnanci.xml");
  try
  {
    while (lReader.Read())
    {
      //zjistime, jestli ma aktualni uzel nejake atributy
      if (lReader.HasAttributes)
      {
        //vypiseme nazev elementu
        Console.WriteLine("Element : {0}",lReader.Name);
        for(int i = 0; i < lReader.AttributeCount;i++)
        {
          //posuneme pozici readeru na atribut a vypiseme jej
          lReader.MoveToAttribute(i);
          Console.WriteLine("Nazev : {0} - Hodnota : {1}",lReader.Name, lReader.Value);
        }
      }
    }
  }
  finally
  {
    lReader.Close();
  }
}

V příkladu zkontrolujeme jestli právě čtený uzel má nějaké a atributy a v případě, že ano, tak použijeme k průchodu cyklus for, kde využijeme instanční vlastnost AttributeCount, která nám vrátí počet přítomných atributů na uzlu. Průchod probíhá tím stylem, že použitím metody MoveToAttribute posuneme XMLReader z pozice uzlu na pozici konkrétního atributu, tudíž vlastnosti Name a Value budou po tomto posunutí vracet název a hodnotu atributu (před posunutím vlastnost Name vrací jméno čteného uzlu, jak je v příkladu ukázáno).

Zápis do XML dokumentu

Tak jako jsou implementace třídy XMLReader používány za účelem jednosměrného čtení XML dokumentu, tak jsou konkrétní implementace asbtraktní třídy XMLWriter použity k zápisu jednotlivých částí XML dokumentu a opět pouze jedním směrem od shora dolů. V základní knihovně třídy .NET frameworku se na rozdíl od třídy XMLReader pro XMLWriter nachází pouze její jediná implementace a to třída XMLTextWriter, pro kterou je zdrojem dat v jazyce XML nějaký datový proud. Třida XMLWriter nám tedy nabízí jednoduché a příjemné rozhraní pro vytváření XML Dokumentů. A jak může vypadat její použití? To můžete vidět níže.

/// <summary>
/// Priklad na vytvoreni XML dokumentu pomoci tridy XMLWriter
/// </summary>
public class XMLWriterPriklady
{
  public static void ZapisZamestnance()
  {
    ArrayList lZamestnanci = new ArrayList();
    lZamestnanci.Add(new Zamestanec("Jan","Novak","Analytik"));
    lZamestnanci.Add(new Zamestanec("Jiri","Joudek","Vyvojar"));
    XmlTextWriter lWriter = null;
    try
    {
      lWriter = new XmlTextWriter(new StreamWriter("C:/zamestnanci2.xml"));
      //zapiseme start dokumentu
      lWriter.WriteStartDocument();
      //zapiseme korenovy element
      lWriter.WriteStartElement("zamestnanci");
      //pro kazdeho zamestnance vytvorime element z odpovidajicimi atributy
      foreach(Zamestanec lZamestnanec in lZamestnanci)
      {
        lWriter.WriteStartElement("zamestnanec");
        lWriter.WriteAttributeString("jmeno",lZamestnanec.Jmeno);
        lWriter.WriteAttributeString("prijmeni",lZamestnanec.Prijmeni);
        lWriter.WriteAttributeString("pozice",lZamestnanec.Pozice);
        lWriter.WriteEndElement();
      }
      //uzavreme dokument
      lWriter.WriteEndDocument();
    }
    finally
    {
      lWriter.Close();
    }

  }
}

Jak vidíte, tak použití je vcelku jednoduché. V příkladu je vytvářen úplně nový dokument, takže první co je po vytvoření instance třídy XMLTextWriter učiněno je zavolání metody WriteStartDocument, která zařídí zapsaní deklarace XML dokumentu (<?xml version="1.0" encoding="utf-8"?>).

Po té pro každého zaměstnance z kolekce vytvoříme pomocí metody WriteStartElement počáteční tag elementu a před zapsáním jeho konce, což se provádí metodou WriteEndElement provedeme zapsání jednotlivých atributů elementu, které nám představují údaje o zaměstnanci. Atribut je do „rozepsaného“ uzlu zapsán za pomoci metody WriteAttributeString, jíž v přetížené verzi, která je v příkladu použita, předáme pouze název a hodnotu vytvářeného atributu.

Příklady ke článku si můžete stáhnout pomocí tohoto odkazu.

Témata článku: Software, Microsoft, Programování, Příjemné zjištění, Jednoduchá pozice, Díl, XML, Práce, Public, Element

Určitě si přečtěte

Budoucností Windows 10 je Fluent Design. Takto bude jednou vypadat celý systém

Budoucností Windows 10 je Fluent Design. Takto bude jednou vypadat celý systém

** Fluent Design je vzhled, do kterého postupně Microsoft převleče celý systém ** Staví na průhlednosti a velkých plochách ** Do Windows 10 se z části dostane už zítra při vydání podzimní aktualizace

16.  10.  2017 | Stanislav Janů | 146

Velká podzimní aktualizace Windows 10 je tady: Co přináší Fall Creators Update

Velká podzimní aktualizace Windows 10 je tady: Co přináší Fall Creators Update

** Po půl roce je tu další aktualizace Windows ** A opět přináší hlavně hromadu drobných kosmetických vylepšení ** Podívali jsme se na ty nejzajímavější

Včera | Jakub Čížek | 93


Aktuální číslo časopisu Computer

Nový seriál o programování elektroniky

Otestovali jsme 17 bezdrátových sluchátek

Jak na nákup vánočních dárků ze zahraničí

4 tankové tiskárny v přímém souboji