HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

XML állomány feldolgozása, adatok egyedi megjelenítése


XML 5. rész

Példaprogram letöltése

11741 bájt

Cikksorozatunk mai részében egy igen összetett XML dokumentum feldolgozásával és képi megjelenítésével foglalkozunk. A példaprogramban vizsgáljuk az XMLDocument, XMLNode, XmlAttribute és az XMLNodeList objektumokat és azok tulajdonságait.

Kezdő lépésként nézzük mit is rejt a mellékelt test.xml állomány. Az állományt a Delphi-hez mellékelt példa adatbázisból hoztuk létre. Onnan is a megrendeléseket exportáltuk XML-be. Megfigyelhető, hogy adott egy „customers” csomópont, mely alatt számos „customer” csomópont található, mindegyiknél egy „azon” nevű attribútumban található az azonosító. Egy-egy „customer” csomópontban megtalálhatók az adott cég alapvető adatai (company, city, country), valamint megrendelései (order) és az ahhoz tartozó adatok.
  <?xml version="1.0" standalone="yes" ?> 
- <customers>
  - <customer azon="C1221">
      <company>Kauai Dive Shoppe</company> 
      <city>Kapaa Kauai</city> 
      <country>US</country> 
      - <order azon="O1023">
         - <employee azon="E5">
            <firstname>Kim</firstname> 
            <lastname>Lambert</lastname> 
            <phone>22</phone> 
            <hiredate>1989. 02. 06.</hiredate> 
            <salary>25000</salary> 
         </employee>
     </order>
     - <order azon="O1123">
         - <employee azon="E121">
            <firstname>Roberto</firstname> 
            <lastname>Ferrari</lastname> 
            <phone>1</phone> 
            <hiredate>1993. 07. 12.</hiredate> 
            <salary>40500</salary> 
         </employee>
      </order>
Feladatunk az lesz, hogy ezt az XML-t értelmezzük programból és jelenítsük meg az egyes „customer” csomópontokat a hozzájuk tartozó adatokkal és az összes „order” csomópont adatával.
A megvalósításhoz szükségünk lesz az XmlDocument osztály egy példányára, egy XmlNode osztályra a csomópontok kezeléséhez és létrehozunk egy counter nevű int típusú változót az aktuális „customer” sorszámának nyilvántartásához.
    private XmlDocument xd = new XmlDocument();
    private XmlNode xn;
    private int counter = 0;
A program indulásakor beolvassuk a test.xml-t az XmlDocument osztály példányába a Load függvénnyel.
      xd.Load(Application.StartupPath + "\\test.xml");
A dokumentum elemei közül a kezelendő „customer” csomópontot helyezzük az XmlNode osztályunk példányába.
      xn = xd.DocumentElement["customer"];
Meghívjuk saját belső függvényünket, mely UpdateLabels névre hallgat és a Form-on lévő feliratokat frissíti annak alapján, hogy aktuálisan hányadik „customer” csomóponton állunk.
      UpdateLabels();
Nézzük most miként is végzi munkáját az UpdateLabels.
Első lépésként kiírjuk, hogy hányadik „customer” csomópont adatai láthatóak. Itt még egyszerű a dolgunk, hiszen csak a counter változónk értékét kell megjeleníteni.
    private void UpdateLabels()
    {
      label1.Text = "#" + counter.ToString();
Ezt követően megjelenítjük az adott „customer” azonosítóját. Ez található a csomópont attribútumában az „azon” paraméterben (<customer azon="C1221">). Ezt kiolvasni az XmlNode Attributes property-jén keresztül lehet. Az Attributes property egy kollekció, hiszen egy csomópont tetszőleges számú attribútummal rendelkezhet. Erre a kollekcióra tekinthetünk úgy is, mint egy tömbre, melynek minden egyes eleme egy XmlAttribute osztályt képvisel. Az Attributes property XmlAttributeCollection osztály típusú. Indexként egy sztringet adhatunk meg, mely a kérdéses attribútum neve lehet. Az XmlAttribute osztálynak van egy Value property-je, melyen keresztül kiolvasható az adott elem értéke. Ennek az osztálynak a Name property-én keresztül elérhetnénk az attribútum nevét is.
      label2.Text = xn.Attributes["azon"].Value;
Következő lépésként a cég nevét olvassuk ki (<company>Kauai Dive Shoppe</company>), melyhez az XmlNode ChildNodes property-jét használjuk fel. Ez a property XmlNodeList osztály típusú és szintén tekinthetünk úgy rá, mint egy tömbre: ha megadjuk hányadik elemét szeretnénk látni, akkor azt egy XmlNode típusban megkapjuk. Mivel az XML-ben minden csomópont tartalmazhat egy vagy több újabb csomópontot, így nem meglepő, ha egy XmlNode osztály property-je egy újabb XmlNode típust ad vissza. Az új csomópontbeli szöveget az InnerText property szolgáltatja. Mivel tudjuk, hogy a XML dokumentumunkban a „customer” csomópont alatt minden esetben az első alcsomópont a cég név, így itt nyugodtan használhatjuk a tömb indexeként a nullát.
      label3.Text = xn.ChildNodes[0].InnerText;
Van azonban más mód is egy-egy alcsomópont eléréséhez. Nézzünk most egy olyan esetet, ahol név alapján keresünk elő egy-egy csomópontot. Ez esetben az XmlNode Item property-t használjuk. Mivel ez a property az XmlNode indexelője, így nevét nem is kell kiírnunk, elegendő csak a szögletes zárójel használata, melyben megadhatjuk sztringként a keresett elem nevét. A visszakapott objektum természetesen most is XmlNode lesz, így a már ismert InnerText property használatával meghatározható a szükséges érték.
      label4.Text = xn["city"].InnerText;
      label5.Text = xn["country"].InnerText;
Bonyolítsuk a helyzetet és nézzük miként érhető el a „customer” csomóponton belül található tetszőleges számú „order” csomópont és azok adatai. Ehhez kérünk egy csomópont listát, vagyis létrehozunk egy XmlNodeList objektumot. Tesszük ezt úgy, hogy az XmlNode típusú objektumunk SelectNodes függvényével varázsoltatunk egy olyan listát, melyben megtalálhatók lesznek az „order” csomópontjai. Ehhez a varázslathoz a "descendant::order" sztringet kell megadnunk. Ebből két dolog következik a SelectNodes függvény számára: az aktuális csomópont, vagyis a „customer” leszármazott csomópontjai között kell keresgélni, méghozzá az „order” nevűeket.
      XmlNodeList nodeList = xn.SelectNodes("descendant::order");
      treeView1.BeginUpdate();
      treeView1.Nodes.Clear();
      TreeNode tn;
      XmlNode xn2;
Mint az már sejthető a névből: az XmlNodeList osztállyal egy olyan objektumot kapunk, mely egy „tömbben” tárolja az egyes csomópontokat, így ezek értelmezéséhez szükségünk lesz egy ciklusra, mely végigmegy az összes elemen. Ehhez készítünk egy foreach ciklust.
Az Order adatok megjelenítéséhez egy TreeView kontrollt választottunk eszközként. Itt minden egyes „order” úgy jelenik meg, hogy egy hierarchia szinttel beljebb kerüljön a hozzátartozó adat. Első lépésként tehát kiolvassuk az aktuális „order” csomópont „azon” attribútumát (<order azon="O1023">) és ez tesszük a TreeView legfelső szintjére.
      foreach (XmlNode order in nodeList)
      {
        tn = treeView1.Nodes.Add("Order ID: " + order.Attributes["azon"].Value);
Ezt követi az adott „order” alcsomópontjainak kiolvasása. Ehhez lekérjük az első és egyetlen elemét (<employee azon="E121">), melyhez az XmlNode FirstChild függvénye tökéletesen megfelel.
        xn2 = order.FirstChild;
        tn.ImageIndex = 6;
        tn.BackColor = Color.Aquamarine;
Ezt követően végigmegyünk az összes adaton, ami itt eltárolásra került és a már ismert módszerrel, név alapján azonosítva az egyes csomópontokat kiolvassuk azok adatait.
        tn.Nodes.Add("Firstname: " + xn2["firstname"].InnerText).ImageIndex = 1;
        tn.Nodes.Add("Lastname: " + xn2["lastname"].InnerText).ImageIndex = 2;
        tn.Nodes.Add("Phone: " + xn2["phone"].InnerText).ImageIndex = 3;
        tn.Nodes.Add("Hiredate: " + xn2["hiredate"].InnerText).ImageIndex = 4;
        tn.Nodes.Add("Salary: " + xn2["salary"].InnerText).ImageIndex = 5;
      }
      treeView1.ExpandAll();
      treeView1.EndUpdate();
      treeView1.SelectedNode = treeView1.Nodes[0];
    }
Ezzel a megjelenítés egy-egy „customer” csomópontnak biztosított. Most már csak arról kell gondoskodnunk, hogy lehessen lapozni, vagyis előre-hátra mozogni az XML állomány „customer” csomópontjai között. Ehhez két nyomógombot fogunk használni.
Ha előre szeretnénk lépni, akkor az XmlNode NextSibling hívásával tehetjük ezt meg.
Előtte azonban célszerű ellenőrizni, hogy nem értünk-e még az állomány végére. Ha a NextSibling null értéket ad vissza, akkor már nincs következő elem.
    private void button1_Click(object sender, System.EventArgs e)
    {
      if (xn.NextSibling != null)
      {
Ha még van következő elem, akkor az xn változónkat - mely tárolja az aktuális „customer” csomópontot -, léptethetjük a NextSibling hívásával a következő azonos szinten lévő csomópontra, mely ismét egy „customer” elem lesz.
        xn = xn.NextSibling;
Ha ez megtörtént, akkor növeljük belső számlálónkat és frissítjük a Form-on lévő adatokat.
        counter++;
        UpdateLabels();
      }
    }
A visszafelé lépkedés hasonlóan történik, csak itt a PreviousSibling függvényt kell használnunk, mellyel egyet előre léphetünk az XML dokumentumban azonos szinten lévő csomópontok között.
    private void button2_Click(object sender, System.EventArgs e)
    {
      if (xn.PreviousSibling != null)
      {
        xn = xn.PreviousSibling;
        counter--;
        UpdateLabels();
      }
    }

Könyv
Ez a cikk megtalálható ebben a könyvben: C# Software Offline 2001 évkönyv 211. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |