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.