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í, Element, Public

6 komentářů

Nejnovější komentáře

  • Daniel Housar 4. 1. 2009 16:36:37
    Ještě dodám takový postřeh. Všechny příklady, které si stahnete jsou...
  • Daniel Housar 4. 1. 2009 16:01:25
    Error 1 The type or namespace name 'Zamestanec' could not be found (are...
  • Pavel Polívka 24. 11. 2007 13:39:58
    Programovou oflline verzi seriálu naleznete ke stažení na...
Určitě si přečtěte

Sbíječky vyměnili za klávesnice. Nový projekt má za cíl přeučit horníky na programátory

Sbíječky vyměnili za klávesnice. Nový projekt má za cíl přeučit horníky na programátory

** Programátorů je málo a horníků bez práce po uzavření dolu Paskov bude moc ** Problém řeší unikátní projekt ** Pilotní kurz dává naději, že by z horníků mohli být použitelní kodéři

28.  11.  2016 | David Polesný | 79

ASUS ZenBook 3 se začal prodávat v Česku. Je ve všem lepší než MacBook, ale bude to stačit?

ASUS ZenBook 3 se začal prodávat v Česku. Je ve všem lepší než MacBook, ale bude to stačit?

** Novinka od Asusu míří přímo proti MacBooku od Applu ** Nabídne daleko více výkonu za stejné peníze

2.  12.  2016 | David Polesný | 127