C# - Xml-állományok használata konfigurációs állományként

forráskód letöltése
Számtalan irodalom és egyéb publikáció foglalkozott már azzal, hogy milyen előnyei vannak az XML-állományok használatának. Cikkünkben az XML-állományok felhasználásának egy igen kézenfekvő területét vesszük górcső alá. Ez nem más, mint annak bemutatása, hogyan és milyen osztályok felhasználásával vehetjük igénybe az XML adta előnyöket akkor, mikor alkalmazásaink konfigurációs állományaként választjuk ezt az állományformátumot.
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.