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.
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.
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.