Registreeri liikmeks  Login  
 Artikel


Veebistuudium - C#, XML, XMLi parsimine
Programmeerimiskeel C# | Veebitehnoloogiad Vladimir Kjahrenov
 

Parsimine tähendab andmete lugemist ning seejärel loetud andmetega mingite tegevuste sooritamist. Parsimine võimaldab XML failist leida just seda infot, mida teil kõige rohkem vaja läheb.

Püüame lugeda XML andmeid kasutades XmlReader klassi. Raamistiku poolt on tehtud kolm erinevat klassi XML andmete lugemiseks. Kui nende funktsionaalsus ei ole piisav siis võite ise alati neid klasse juurde tekitada.

 

XMLi lugemiseks saab kasutada tavalisi System.IO klasse. Läbi IO klasside on võimalik XMLi lugeda nii failist kui ka voost. Sisuliselt ei ole vahet kumba meetodit te kasutate aga, et oleks lihtsam jälgida siis võite ette kujutada nii, et Fail on andmekandjale salvestatud nimeline baidijada, voog on aga kusagilt mujalt (võrk, andmebaas, jne) tulev baidijada.

 

Proovime alustuseks lugeda sisse tavalise tekstifaili.

 

Selleks on meil esmalt vaja System.IO nimeruumi

 

using System.IO;

 

ning seejärel kirjutame protseduuri, mis avab tekstifaili ja trükib selle rea kaupa ekraanile.

 

string FailiNimi = @"c:\mingifail.txt";

if (File.Exists(FailiNimi)) { // kui fail on olemas

StreamReader FailiLugeja = File.OpenText(FailiNimi);

string rida = FailiLugeja.ReadLine();

 

while (rida != null) {

            Console.WriteLine(rida);

rida =FailiLugeja.ReadLine();

}

FailiLugeja.Close();

}

 

Kui soovite kogu faili mällu laadida ja seejärel temaga edasi toimetada siis tuleks System.Text.StringBuilder klassi abil ehitada faili sisaldav string.

 

Analoogselt tekstifaili lugemisega käib ka XML faili lugemine. Lugeja on lihtsalt XmlTextReader tüüpi objekt. XmlTextReader oskab XMLi lugeda voost, stringist ja TextReader objektist.

 

XmlTextReader objekti saame tekitada järgneva koodireaga:

 

XmlTextReader MinuXmlLugeja = new XmlTextReader(@"c:\mingifail.xml");

 

Kui lugeja olemas siis saame XMLi oksa (node) kaupa lugema hakata. Enamasti on seda kasulik teha mingi korduslausega:

 

while (MinuXmlLugeja.Read()) {

      // tee midagi

}

 

Kui soovite XML andmeid analüüsida või muul moel kasutada on vaja teada, mis tüüpi oksal Te parajasti olete. Oksa tüübi selgitamiseks saate kontrollida NodeType omadust, selle omaduse väärtus võib olla üks järgnevatest:

 

Need kolm oksa tüüpi Element, TypeText, EndElement on kõige olulisemad, kuid lisaks neile on veel olemas:

Oksa tüüp

Selgitus

XmlNodeType.CDATA

Mitte parsetav tekst

XmlNodeType.Comment

XML kommentaar

XmlNodeType.ProcessingInstruction

Töö juhised erinevatele parseritele ja rakendustele

XmlNodeType.WhiteSpace

Tühjus elementide vahel

XmlNodeType.XmlDeclaration

XMLi kirjeldused

 

Kui element võib olla tühi  e. algus ja lõpu tah on üks ja see sama siis tuleks  seda kontrollida IsEmptyElement omaduse kaudu.

 

Järgnevas näites genreerime XmlReader’it kasutades väljundisse uue XMLi.

 

XmlTextReader MinuXmlLugeja = new XmlTextReader("mingifail.xml");

while (MinuXmlLugeja.Read()) {

  switch (MinuXmlLugeja.NodeType) {

    case XmlNodeType.Comment:

      Console.WriteLine("<!--" + MinuXmlLugeja.Value + "-->");

      break;

    case XmlNodeType.Element:

      if (MinuXmlLugeja. IsEmptyElement) {

        Console.WriteLine("<" + MinuXmlLugeja.Name + " />");

      }else {

        Console.WriteLine("<" + MinuXmlLugeja.Name + ">");

      }

      break;

     case XmlNodeType.EndElement:

       Console.WriteLine("</" + MinuXmlLugeja.Name + ">");

       break;

     case XmlNodeType.Text:

       Console.WriteLine(MinuXmlLugeja.Value);

       break;

     default:

       // siin võiks midagi teha ülejäänud oksadega

       Console.WriteLine(" --- Tundmatu oks --- ");

       break;

     }

}

 

Lisaks tekstilisele sisule võivad elemendid omada ka atrinuute.  Kas elemendil on atribuut saame me teada läbi HasAttribute omadeuse. Attribuutide arvu saame teada AttributesCount omadusest. Edasi on meil võimalik küsida atribuute, kas nime või indeksi järgi kasutades GetAttribute meetodit

 

MinuXmlLugeja.GetAttribute(0); // esimese atribuudi väärtus

MinuXmlLugeja GetAttribute(”ID”); // atribuudi ID väärtus

 

või palume lugejal liikuda järjest järgmisele atribuudile.

 

if (MinuXmlLugeja.HasAttributes){

    for (int i = 0; i < MinuXmlLugeja.AttributeCount; i++){

        MinuXmlLugeja.MoveToAttribute(i);

        Console.Write(" {0}='{1}'", MinuXmlLugeja.Name,

                      MinuXmlLugeja.Value);

    }

    MinuXmlLugeja.MoveToElement();

}

 

Nagu iga teisegi sisend/väljud protseduuri nii ka XML parsimise juures võib tekkida vigu. Kui XmlReader avastab vea annab ta sellest teada läbi XmlExeption’i. Seega paks kogu XMLi lugemine olema try ... catch struktuuri sees:

 

XmlTextReader MinuXmlLugeja = new XmlTextReader("mingifail.xml");

try {

while(MinuXmlLugeja.Read()) {

// tee midagi

}

}

catch(XmlException e) {

Console.WriteLine(e.Message);

Console.WriteLine("Pronleem XML failis – rida {0}, veerg {1}",

    MinuXmlLugeja.LineNumber, MinuXmlLugeja.LinePosition);

}

 


PS! Kui sul tekkis artiklit lugedes küsimusi või kommentaare, siis palun esita need XML foorumisse


Lisatud : 16.03.2007 17:47:11
Hinne : 3,00 (0)
Vaadatud : 277
Heaks kiidetud : Vladimir Kjahrenov


Kommentaarid (0) 

  

  Hinda...
 

Viimased kommentaarid


 
  Et saaksid kommenteerida pead Sa olema sisse loginud.

   1.11.2007 6:49:59
  Saada kommentaar
  

Kõik õigused kaitstud. ENETA © 2005-2006   Terms Of Use  Privacy Statement
DotNetNuke® is copyright 2002-2007 by Perpetual Motion Interactive Systems Inc.