« XML-kezelés C#-ban »

Szükségem volt egy programozási feladatnál XML-fájlok manipulálására. Leginkább csak olvasás, de adott esetben módosítás is. Lehet csak nekem került bő negyedórámba megtalálni, mivel semmilyen C#-pal kapcsolatos könyvet nem olvastam, a neten pedig eléggé összevissza volt az információ, de végül azért sikerült, és közel sem olyan bonyolult a dolog. Az XML egyébként kiváló lehetőség ha nem akarunk komolyabb dolgokat tárolni és adatbázis-kezelőkkel dolgozni, kezelni pedig nem sokkal bonyolultabb mint egy SQL-lekérdezést megírni. Annyira hozzáteszem hogy lebecsülni sem szabad az erejét, ugyanis pont nemrég láttam egy csupán néhány soros kódot, mely cirka négy-ötszáz megabájtos XML-fájlokban dolgozott, meglepően gyorsan.

A System.Xml névtérre természetesen szükség lesz, egyébként ezen belül gyakorlatilag minden a rendelkezésünkre áll, érdemes utánaolvasni.

Adott tehát egy XML-fájl, mely mondjuk egy telefonkönyv adatbázisát képezi, benne ismerőseink nevével, becenevével, telefonszámával és e-mail-címével:

<?xml version="1.0" encoding="UTF-8"?>
<szemelyek>
	<szemely>
		<nev>Kép Ernő</nev>
		<nick>Monitor</nick>
		<mobil>+36201234567</mobil>
		<email>kep.erno@qvga.info</email>
	</szemely>
	<szemely>
		<nev>Vincs Eszter</nev>
		<nick>Vinyó</nick>
		<mobil>+36301234567</mobil>
		<email>vincs.eszter@quantumdigital.com</email>
	</szemely>
</szemelyek>

Oké, most a System.Xml névtér meghívása után a szükséges helyen a kódunkban az alábbi sorokat helyezzük el:

XmlDocument XD = new XmlDocument();
XD.Load("C:\\szemelyek.xml");
XmlNode XN = XD.DocumentElement;

Ez létrehoz egy XD névre hallgató XmlDocument objektumot és betölti abba a C:\szemelyek.xml fájl tartalmát. Az ilyen módú meghívásnál mindig kettő darab visszaperjelet írjunk, különben az escape-elés miatt hiba lép majd fel. (Itt most arról ne essék szó, hogy a fájl beolvasásánál adott esetben előforduló hibák ellen hogyan védekezzünk.)

Szóval van egy dokumentumunk, innentől kezdve szabadon garázdálkodhatunk benne. Az adatok kiolvasásának és módosításának legegyszerűbb módja az XmlNodeList-en keresztül lehetséges. Ebben egyesével el tudjuk érni a szükséges elemek adatait, az alábbi módon:

XmlNodeList XNL = XN.SelectNodes("/szemelyek/szemely/nev")

Vagyis most a nevekkel fogunk dolgozni. Fontos, hogy mindig perjellel legyen kezdve, és anélkül befejezve az elérés. Ha csak a szemelyek-ig adjuk meg, akkor az összes elemének értéke össze lesz konkatenálva (sic!). Most írjuk ki a konzolra az összes nevet, mely szerepel az adatbázisban:

for (int i = 0; i < XNL.Count; i++)
{
    System.Console.WriteLine(XNL.Item(i).InnerText.ToString());
}

Tegyük fel, hogy Vincs Eszter megházasodik, ezért a neve Merevlemezné Vincs Eszterre változik, módosítanunk kell tehát adatait:

XNL.Item(1).InnerText = "Merevlemezné Vincs Eszter";
XD.Save("C:\\tables.xml");

Gyakorlatilag ennyi a lényeg. Lehet, hogy van az XML-kezelésnek szebb és jobb módja, nekem ezek azonban teljesen megfeleltek a szükséges bolondvédelemmel kiegészítve természetesen.

Remélem segített.

Kommentek RSS ikon
A bejegyzéshez érkezett kommentek, amiket RSS csatornán is követhetsz.
Buta vagyok a C#-hoz (is), de így nem a Kép Ernőből lesz feleség?
Nfol: valóban, elfelejtettem átírni, eredetileg őt buheráltam, csak vicces lenne ugye ha belőle lenne feleség. Köszi. :D
Mefi: Én köszönöm, jól fog ez még jönni. :)
Ez a régi módszer, de ha ez tetszett próbáld ki a LINQ to XML-t, a C# 3.0-tól a nyelv része. Be fog jönni, ezt garantálom… ha nem lógok neked egy sörrel. :)
Nfol: nincs mit! :)

ogabi: nézegettem, fogokok is vele szerintem komolyabban foglalkozni ha úgy adódik, meg anno egy ismerős mutatta a Linkq To SQL-t, amitől majdnem hanyatdobtam magam. :D
szebb lenne foreach-csel ;)
Mefi: Ezt a cikket ajánlom Scott Mitchell tollából, tömör, lényegretörő, és nagyon jól átadja a szükséges tudást.
http://www.4guysfromrolla.com/arti[…]
Morph: nyilván, meg try-catch meg egyebek, de mondom hogy ezekre nem tértem most ki direkt. :)

ogabi: hát kösz, ez annyira megtetszett hogy át is írtam linq-ra az egészet. :D
ogabi: Ez így van, én is így használtam az XML kezelést, amíg ki nem próbáltam egyszer a Linq-s módszert is :) Bár jelenleg nem használatunk mindenütt C# 3.5-öt, csak 2.0-át, abban pedig még nincs Linq.

Amúgy Mefi, az egész Linq kezelést érdemes megnézni, mert iszonyúan leegyszerűsíti és felgyorsítja pl. a listakezeléseket, különösen könnyű megtanulni akkor, ha már ismered az SQL-t, ami szerintem neked nem gond :)
karaj: jaja, most jobban átnéztem és roppant nagy jóság.
Ha jól emlékszem, iszképelés miatt nem kell a \\, ha a " elé beraksz egy @-t. Jó lesz megint elkezdeni programozni, februárban országos döntő… :]
Új komment

Itt az adott bejegyzésben elhangzottakhoz szólhatsz hozzá. Ha primitív, csúnya, vagy bunkó erkölcsről teszel tanúbizonyságot, tuti, hogy kimoderállak és rosszat mondok rólad. A hozzászólás nem kötelező, amit írsz vállald föl!

Ezeket az adatokat - ha a böngésződ kezeli a kukikat - csak egyszer kell megadnod, később módosíthatod.

Ha van gravatarod - és a gravataros e-mail-címeddel kommentálsz -, akkor az megjelenik. Ha nincs, vagy nem tudod miaz, akkor olvasd el az útmutatót és regisztrálj.

Neved: E-mail címed (nem jelenik meg): Webszájtod (ha van): Kommented: Mennyi kettő és kettő összege?
Ez védelmi célokat szolgál, szimplán írd be a fenti összeadás összegét!

A kommentedet írhatod nagyobb mezőbe vagy akár formázhatod is, de ha nem szalonképes, akkor moderálom!

Ajánló
Ebben a témában, esetleg ezen a napon voltak még ilyenek is:

Beszél az új iPod Shuffle (2009. március 11., 11:59:54)
Google Buzz (Zümm) (2010. február 11., 03:00:48)
Kétoszlopos oldalelrendezés (2006. január 15., 01:02:09)

Érdekességek
Száraz számok, pusztán csak tények:

Ez a bejegyzés 758 napja született, 675 szóból, és 3643 karakterből áll. Ajánlhatod bizonyos linkgyűjtő oldalaknak: