Xml olvasó
Amennyiben C# kódból kívánunk XML fájlt feldolgozni (beolvasni), úgy több lehetőség közül választhatunk. Például példányosíthatunk egy XmlTextReader példányt, és metódusain keresztül beolvashatjuk az XML fájlt.
Ugyanakkor ezzel nagyon alacsony szintű XML kezelést valósítanánk meg. De az XmlTextReader mindenképpen hasznos, de nem direktbe fogjuk használni később, hanem alapként.
Pl.:
XmlTextReader r = new XmlTextReader (”C:\\adatok.xml”);
Mint látszik, az XmlTextReader konstruktorának csak az XML fájl neve szükséges. Mivel az XML fájl önleíró, a használt kódlap adatait is tartalmazza.
A konstruktor kivételt aktivál, ha az XML fájl nem jól formattált.
Xml dokumentum
Amennyiben C# kódból kívánunk XML fájlt feldolgozni (beolvasni), úgy első lépésként példányosítsunk egy XmlTextReader példányt.
XmlTextReader r = new XmlTextReader (”C:\\adatok.xml”);
Második lépésként állítsunk elő egy XmlDocument példányt ezen XML fájl további feldolgozására:
XmlDocument dok = new XmlDocument();
Az XmlDocument konstruktorának még nincs szüksége semmilyen kiegészítő adatra. Az XmlDocument példány egy üres XML dokumentumot képvisel. Alkalmas arra, hogy új elemeket adjunk hozzá, de alkalmas arra is, hogy egy XML fájlból töltsük fel adatokkal.
Xml betöltése
Amennyiben C# kódból kívánunk XML fájlt feldolgozni (beolvasni), úgy első lépésként példányosítsunk egy XmlTextReader példányt.
XmlTextReader r = new XmlTextReader (”C:\\adatok.xml”);
Második lépésként állítsunk elő egy XmlDocument példányt ezen XML fájl további feldolgozására:
XmlDocument dok = new XmlDocument();
Amennyiben az üres dok nevű példányt a fájlban tárolt adatok alapján kívánjuk feltölteni elemekkel, úgy a Load() metódust kell használni:
dok.Load( r );
Xml csomópont
Az XML fájl betöltése után az XMLDocument példányunkban az elemek, mint XmlNode példányok jelennek meg.
XmlTextReader r = new XmlTextReader (”C:\\adatok.xml”);
XmlDocument dok = new XmlDocument();
dok.Load( r );
A teljes dokumentum a dok.DocumentElement-be kerül bele, hiszen egy XML fájl csak egy elemet tartalmazhat direktben.
Minden további elem ezen gyökérelemen belül található meg, több szinten keresztül egymásba ágyazva.
A gyökérelemben lévő beágyazott elemek a dok.DocumentElement.ChildNodes listában vannak. Mindegyik XmlNode típusú, tehát ez egy rekurzív adatszerkezet.
Xml csomópontok bejárása I
Az XML fájl betöltése után az XMLDocument példányunkban az elemek, mint XmlNode példányok jelennek meg.
XmlTextReader r = new XmlTextReader (”C:\\adatok.xml”);
XmlDocument dok = new XmlDocument();
dok.Load( r );
A gyökérelembe beágyazott elemeken egy egyszerű foreach ciklussal végig lehet menni:
foreach(XmlNode node in dok.DocumentElement.ChildNodes)
{
Console.WriteLine( node.Name );
}
A .Name jellemző tartalmazza az elem nevét. A fenti kis ciklus kiírja az összes első szinten beágyazott elem nevét.
Elágazás csomópontok nevére
Az XML fájl betöltése után az XMLDocument példányunkban az elemek, mint XmlNode példányok jelennek meg.
XmlTextReader r = new XmlTextReader (”C:\\adatok.xml”);
XmlDocument dok = new XmlDocument();
dok.Load( r );
Amennyiben csak bizonyos elemeket kívánunk feldolgozni, van lehetőség az elemek nevére elágazást szervezni:
foreach(XmlNode node in dok.DocumentElement.ChildNodes)
{
if (node.Name==”dolgozo”) Console.WriteLine( node.InnerText );
}
A .Name jellemző tartalmazza az elem nevét. A fenti kis ciklus kiírja az összes dolgozó típusú elemben tárolt értéket.
Ha a gyökérelem többfajta típusú elemet is tartalmaz, switch szervezése a jobb megoldás:
foreach(XmlNode node in dok.DocumentElement.ChildNodes)
{
switch( node.Name )
{
case ”dolgozo” :
.... <dolgozo> feldolgozása ...
break;
case ”vendeg” :
.... <vendeg> feldolgozása ...
break;
}
}
Csomópont tartalmának kinyerése
Az XML fájl betöltése után az XMLDocument példányunkban az elemek, mint XmlNode példányok jelennek meg.
Amennyiben sikerült egy XmlNode elemhez hozzájutnunk, úgy azt már teljes körűen feldolgozhatjuk. Az elemben tárolt értéket kiolvashatjuk a Value jellemzőjén keresztül:
foreach(XmlNode node in dok.DocumentElement.ChildNodes)
{
if (node.Name==”dolgozo”) Console.WriteLine( node.Value );
}
A Value jellemzőnek egy problémája van: változatlan formában tartalmazza az elem értékét, vagyis ha az elem értékében speciális karakterek fordulnak elő, akkor azt változatlan formában fogjuk megkapni:
<bank>K & H</bank>
a ’K&H’ kódolt alakja, mivel az ’&’ jel speciális jelnek minősül.
A másik módszer szerint ne a Value, hanem az InnerText jellemzőn keresztül olvassuk ki a tartalmat. Az InnerText esetén a speciális karakterek visszakódolt alakra kerülnek, így a fenti példa esetén visszakapjuk a ”K&H” tartalmat.
Csomópont attribútumának kinyerése
Az XML fájl betöltése után az XMLDocument példányunkban az elemek XmlNode példányokként jelennek meg.
Amennyiben sikerült egy XmlNode elemhez hozzájutnunk, úgy azt már teljes körűen feldolgozhatjuk. Az elemhez tartozó attribútumokat az elem Attributes vektorában találhatjuk meg. Hivatkozni az attribútum nevére kell. Ekkor kapunk egy XmlAttribute osztálybeli példányt. Ennek már az InnerText jellemzője tartalmazza is a keresett értéket:
foreach(XmlNode node in dok.DocumentElement.ChildNodes)
{
if (node.Name==”dolgozo”)
{
Console.WriteLine(node.Attributes[”nev”].InnerText );
}
}
Ez az alábbi esetben kiválóan működik:
<dolgozo nev=”buga jakab” />
de gondban leszünk, ha nincs ilyen nevű attribútumunk:
<dolgozo>buga jakab</dolgozo>
Ha fel szeretnénk készülni erre az esetre is, akkor két lépésre kell bontani a fenti kódot:
foreach(XmlNode node in dok.DocumentElement.ChildNodes)
{
if (node.Name==”dolgozo”)
{
XmlAttribute a = node.Attributes[”nev”];
if (a!null) Console.WriteLine( a.InnerText );
}
}
Amennyiben nincs nev nevű attribútumunk, úgy az első lépés végén az a változónk értéke null lesz, jelezve, hogy nincs példányunk.
Xml csomópontok bejárása II
Az XML fájl betöltése után az XMLDocument példányunkban az elemek, mint XmlNode példányok jelennek meg.
A feldolgozást a gyökérelem gyermek elemein kezdjük. Ezek a direktben az első szinten tartalmazott elemek. Amennyiben ezek is további elemeket tartalmaznak, a feldolgozás természetesen további mélységekbe is vezethet:
foreach(XmlNode node in dok.DocumentElement.ChildNodes)
{
if (node.Name==”dolgozo”)
{
foreach(XmlNode n in node.ChildNodes)
{
if (n.Name==”nev”) Console.WriteLine( n.InnerText );
}
}
}
Ez az alábbi esetben kiválóan működik:
<dolgozok>
<dolgozo>
<nev>Buga jakab</nev>
<eletkor>20</eletkor>
</dolgozo>
<dolgozo>
<nev>Micimacko</nev>
<eletkor>3</eletkor>
</dolgozo>
<dolgozok>