A megoldáshoz a System.Xml.Serialization névtér XmlSerializer osztályát használjuk fel, melynek Serialize és Deserialize metódusai a legalkalmasabbak arra, hogy az alkalmazásainkba adatokat olvassunk be egy XML-állományból, illetve oda adatokat írjunk ki, mint tettük ezt a Windows korábbi verzióiban az .INI-állományok esetében.
A gondolat nem idejétmúlt, még ha arra gondolunk is, hogy a Windows jelenlegi verzióiban adataink megőrzésére a Regisztrációs adatbázist használjuk. Azonban figyelembe kell vennünk, hogy az XML-technológia nem a fent említett tárolási módszernek kíván alternatívája lenni. A ma még csak kibontakozóban lévő web-alapú világban ugyanis az alkalmazások kvázi „kommunikációs-egységként” használják az XML-szabványt (gondoljunk csak a WebService-ekre), információkat ebben a formátumban cserélnek, a hálózati protokollok kitűnően kezelik, megbízható és nem utolsósorban a kellő támogatottsága is megvan a fejlesztői oldalon. Elég csak a .NET Framework Class Library gazdag kínálatára gondolni.
Alkalmazásunkban induláskor egy XML-állomány adatait olvassuk be a memóriába, majd jelenítjük meg kontroljainkban.
Az alkalmazás mappájában található config.xml konfigurációs állomány felépítését vizsgálva szembetűnhet, hogy rendelkezik egy cím bejegyzéssel a <Title></Title> elemek közt, valamint egy menüvel a <Menus></Menus> elemek közt. Ez utóbbi névvel és almenükkel rendelkező elemekre bomlik tovább. A felépítés ismeretében már látható, hogy miért van egy TextBox és két ListBox kontrolunk a megjelenítésre. Ezen kontrolok tartalmát módosítva, majd a ’Mentés a config.xml állományba’ feliratú gombra klikkelve az adatok kimenthetők, majd az alkalmazás újraindításával a frissített állomány kerül beolvasásra. A beolvasó, illetve mentő műveletek elvégzéséhez egy osztály csoportot hoztunk létre, melyet a Config.cs állományban helyeztünk el.
A mentés lényege, hogy egy osztálypéldányt töltünk fel adatokkal, majd módosítunk, végül az XmlSerializer osztály metódusával kimentünk az XML-be. Az osztály felépítése a config.xml állomány sémáját tükrözi.
Az XML IO-műveletek kezelésére létrehozunk egy Config nevű osztályt, mely statikus metódusaival végzi a műveleteket. Az adattároló ConfigurationsData (mint a config.xml gyökéreleme) objektum induláskori feltöltése a GetSettings metódussal történik:
public static ConfigurationData GetSettings(String filename)
{
StreamReader sr = File.OpenText(filename);
XmlSerializer serializer = new XmlSerializer(typeof(ConfigurationData));
ConfigurationData data = (ConfigurationData) serializer.Deserialize(sr);
sr.Close();
return data;
}
Az adatok kiírása a SetSettings metódussal valósul meg; mindkét esetben látható, hogy az XmlSerializer osztály Serialize és Deserialize metódusa is egy típust vár paraméterként, mely a ConfigurationsData. A ConfigurationsData osztály felépítésére jellemző, hogy egy címmel (Title) és egy listával rendelkezik. A lista további listákat tartalmaz, ezek lesznek a csoportok. Tagváltozói:
public class ConfigurationData
{
private String title;
private Menu[] menus;
És az ezeket állító property-k. A property-k fölött megadott attribútum jelzi az IO metódusnak, hogy milyen szinten található az adott adat az XML-ben:
[XmlElement(ElementName="Title")]
public String Title {
get
{
return title;
}
set
{
title = value;
}
}
A csoport elemei pedig Menu típusú elemek, melyet később deklarálunk:
[XmlArray(ElementName="Menus")]
public Menu [] Menus
{
get
{
return menus;
}
set
{
menus = value;
}
}
}
A Menu osztályú objektumok tartalmazzák majd a csoportokat a csoport nevével, valamint a nevek listájával. Rendelkezik két tagváltozóval:
public class Menu
{
private String name;
private String [] bars;
És két property-vel. A csoportnevet állító property:
[XmlAttribute(AttributeName="Name")]
public String Name
{
get
{
return name;
}
set
{
name = value;
}
}
A nevek listáját állító property:
[XmlArrayItem(ElementName="Bar")]
public String [] Bars
{
get
{
return bars;
}
set
{
bars = value;
}
}
}
Az alkalmazás Form-ján elhelyezett mezőben megadhatunk egy új csoportnevet, melyet felvehetünk a csoportlistára az ’Új csoport felvétele’ gombbal, majd elemeket is adhatunk a csoporthoz, ha a mezőbe megadott nevet úgy szúrjuk be az ’Új csoporttag felvétele’ gombbal, hogy a kívánt csoport nevét jelöljük ki a bal oldali ListBox kontrolban. Ekkor az adatok még csak a memóriába kerülnek, és frissítik a ConfigurationData objektum elemeit. Ahhoz, hogy ezek kiíródjanak a config.xml állományba, természetesen a mentés gombra kell kattintani. Az XML frissítés előtti és utáni összetétele látható a felületre helyezett mezőben.