C# - Egyszerű objektumok konvertálása XML adatfolyammá

forráskód letöltése
Az XML technológiának köszönhetően egyszerűbbé, és mindenek előtt szabványossá vált az adatok mozgatása a hálózatban. Az XML megjelenik az adattárolás területén is, mivel mind kiírni, mind pedig beolvasni minden eddiginél könnyebb az adatokat. Cikkünkben bemutatjuk, hogyan „szerializálhatunk” egy objektumtömböt az objektumok jellemző tulajdonságaival egy XML állományba, és alakíthatjuk azt vissza tömbbé.
A mellékelt példában két függvényben implementáltuk a bevezetőben említett funkciókat. A programunk generál egy ArrayList objektumot, benne Point struktúrákkal, majd a PointListToXml metódusunk visszaad egy karakterláncot, mely nem más, mint egy XML adatfolyam. Az XmlToPointList metódussal a folyamat megfordítható. Lássuk most részletesen a metódusok működését.
PointListToXml metódus
A metódus paramétere egy ArrayList objektum, melyet meghívása előtt feltöltünk példaadatokkal. Visszatérési értéke pedig egy karakterlánc, melyben XML-formátumban található meg a lista tartalma.
Első lépésként létrehoztunk egy StringBuilder objektumot, mely tartalmazza majd az adatfolyamot.
StringBuilder xml = new StringBuilder();
Majd hozzáláttunk létrehozni a formázott adatfolyamot. Elsőként az XML fejlécét adtuk a string-hez.
xml.Append("<?xml version=\"1.0\" encoding=\"utf-16\"?>");
A nyitótag elhelyezése következett.
xml.Append("<Points>");
Egy ciklussal feldolgoztuk a kapott listát, majd elemeinek tartalmát egy-egy bejegyzésként elhelyeztük az adatfolyamban úgy, hogy az X és Y mezők értékei a bejegyzések attribútumaiba kerültek.
Point p = Point.Empty;
for(int i=0;i<pointList.Count;i++)
{
  p = (Point)pointList[i];
  xml.Append("  <Point x=\"" + p.X.ToString() + "\" y=\"" + p.Y.ToString() + "\"/>");
}
Majd a záró tag következett.
xml.Append("</Points>");
A létrejött XML adatfolyam a következőképpen fest.
<?xml version="1.0" encoding="utf-16"?>
<Points>
  <Point x="0" y="0" />
  ...
</Points>
XmlToPointList metódus
A metódus paramétere egy karakterlánc, mely nem más, mint az XML adatfolyam, és amelyből újra kell generálnunk a tömböt.
Az XmlDocument osztály LoadXml metódusa kiváló segítség ahhoz, hogy egy szöveges formában megjelenő XML-t is be tudjunk olvasni ebbe az objektumba.
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
Az osztály DocumentElement property-je visszaadja a gyökérelem objektumát. Ennek nevét lekérdezve megtudhatjuk, hogy a megfelelő formátumú adatfolyamot tartalmazza az XmlDocument objektum, vagy sem. Amennyiben igen, akkor egy ciklussal végigmehetünk a gyermekelemeken, kiolvasva azok attribútumait.
if (doc.DocumentElement.Name == "Points")
{
  foreach (XmlNode node in doc.DocumentElement.ChildNodes)
  {
    list.Add(new Point(Convert.ToInt32(node.Attributes["x"].Value),Convert.ToInt32(node.Attributes["y"].Value)));
  }
}
Ebben az egyes XmlNode objektumok Attributes property-je van a segítségünkre.
A mellékelt példa TabControl kontroljának első füle alatt generálhatjuk az XML adatfolyamot, melyet egy állományba (Points.xml) mentünk, majd megjelenítünk egy böngészőkontrolban. A másik fül alatt visszaalakíthatjuk az adatfolyamot, és az elemek tulajdonságait megjelenítjük egy ListBox-ban.