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.

Diskuze (6) Další článek: Kancelářský balík OpenOffice.org 2.0 RC1 ke stažení

Témata článku: , , , , , , , , , , , , ,