Registreeri liikmeks  Login  
 Artikel


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

XML failil on kaks staatust, mis näitavad tema kvaliteeti:

·        Well-Formed – korrektselt vormistatud st XML vastab W3 poolt seatud XMLi reeglitele

·        Valid – so Well-Formed ning lisaks vastab see XML teie poolt seatud reeglitele

Kastuades XmlTextReader klassi saame vea siis kui XML ei ole Well-Formed. Täpsemaid kontrolle (millised elemendid on olemas, kas nad on õiges järjestuses jne) aga ei rakendata.

XMLi täpsemaks kontrollimiseks on kaks moodust: DTD dokumendid ja XML Schema. Siinkohal ei hakka vaatama, kuidas neid dokumente moodustada, vaid vaatame, mis saab siis kui teil on selline dokument olemas ja tahate teada, kas XML sisend vastab sellele.

 

Järgnevalt vaatleme kahte erinevat lähenemist XML valideerimisele. .NET raamistiku 1.x versioonis oli XMLi valideerimiseks XmlValidatingReader klass, raamistiku 2.0 versioonis seda enam ei ole, ning selle asemel saab kasutada XmlReader klassi. Suurim erinevus nende kahe vahel seisneb selles, et kui ValidatingReader avastas vea sai selle kinni püüda try ... catch konstruktsiooni abil, nüüd tuleb selleks aga kasutada sündmusi.

 

XmlReader on huvitav klass ka selle poolest, et lugemise määranguid ei edastata mitte omaduste kaudu vaid spetsiaalse omaduste objektina. Seega, kui soovime XML failist lugeda, ning samal ajal kontrollida, et loetav XML oleks korrektne peame tegema lugemismäärangute objekti ning edastama selle lugeja objektile.

 

Valideerimiseks kasutame schemat, mis on määratud XML failis.

 

<juurikas xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

      xsi:noNamespaceSchemaLocation ="naidis.xsd">

 

Esmalt vaatame, kuidas valideerida parsimise ajal:

 

XmlReaderSettings maarangud = new XmlReaderSettings();

 

// kontrollimiseks kasutame schemat

maarangud.ValidationType = ValidationType.Schema;

 

// schemat asukoht on näiatud XML failis

maarangud.ValidationFlags = XmlSchemaValidationFlags.ProcessSchemaLocation;

 

// probleeme lahendame meetodiga xvr_ValidationEventHandler

maarangud.ValidationEventHandler +=

                    new ValidationEventHandler(xvr_ValidationEventHandler);

 

// Teeme objekti XMLi lugemiseks

XmlReader lugeja = XmlReader.Create(@"C:\Erki\mingifail2.xml", maarangud);

 

// Hakkame parsema

while (lugeja.Read());

 

reader.Close();

 

Probleeme haldav meetod on üsna lihtsakoeline:

 

private void xvr_ValidationEventHandler(object sender,

                                                   ValidationEventArgs e) {

    Console.WriteLine("Viga! {0}", e.Message);

    Console.WriteLine("XML exception: Ln {0} Col {1}",

                          e.Exception.LineNumber,e.Exception.LinePosition);

}

 

Teine meetod on mitte XMLi jupi kaupa parseda vaid lugeda kogu XML mällu. Kasulik väikeste XML failide juures. Et näide oleks põnevam loeme XMLi kasutades andmevoogu, mille saame tavalisest faili lugemisest.

 

FileStream fs = File.Open(@"C:\Erki\mingifail2.xml", FileMode.Open);

XmlDocument xdoc = new XmlDocument();

XmlReaderSettings maarangud = new XmlReaderSettings();

maarangud.ValidationType = ValidationType.Schema;

maarangud.ValidationFlags = XmlSchemaValidationFlags.ProcessSchemaLocation;

maarangud.ValidationEventHandler +=

                    new ValidationEventHandler(xvr_ValidationEventHandler);

 

XmlReader lugeja = XmlReader.Create(fs, maarangud);

xdoc.Load(lugeja); // edaspidi on kogu XML kasutatav läbi xdoc’i

fs.Close();

 

Kui XML failis pole schemat määratud, või lihtsalt soovite kontrollida mõne teise schema järgi siis saate sobiva schema määrata programmselt. Kontrolli võib teostada peale XML faili mällu laadimist kasutades Validate meetodit:

 

XmlDocument xdoc = new XmlDocument();

xdoc.Load("mingifail2.xml");

xdoc.Schemas.Add(null, "naidis.xsd");

ValidationEventHandler veh =

                    new ValidationEventHandler(xvr_ValidationEventHandler);

xdoc.Validate(veh);

 

Või XML faili laadimise ajal, määrates schema ära määrangutes:

 

FileStream fs = File.Open("mingifail2.xml", FileMode.Open);

XmlDocument xdoc = new XmlDocument();

XmlReaderSettings settings = new XmlReaderSettings();

settings.Schemas.Add(null, "naidis.xsd");

settings.ValidationType = ValidationType.Schema;

settings.ValidationEventHandler +=

                    new ValidationEventHandler(xvr_ValidationEventHandler);

XmlReader reader = XmlReader.Create(fs, settings);

xdoc.Load(reader);

fs.Close();

 

Lisaks XmlDocument objektile on võimalik XMLi laadida ka DataSet’i sisse. Kuna DataSet hoiab kõiki andmeid XML kujul siis on XML andmete DataSeti laadimine tehtud äärimiselt lihtsaks. Järgnevalt loeme DataSeti XML faili, koos seal näidatud Schemaga:

 

myDS = new DataSet();

myDS.ReadXml("C:\Erki\mingifail2.xml", XmlReadMode.ReadSchema);

 

Kui XML failis ei ole Schemat näidatud on võimalus see genereerida vastavalt laetava XML faili struktuurile:

 

myDS = new DataSet();

myDS.ReadXml("C:\Erki\mingifail.xml", XmlReadMode.InferSchema);

 

Loomulikult on võimalik ka ette määrata, kust tuleb schema ja kust tulevad andmed:

 

myDS = new DataSet();

myDS.ReadXmlSchema(@"C:\Erki\naidis.xsd");

myDS.ReadXml(@"C:\Erki\naidis.xml", XmlReadMode.IgnoreSchema);

 


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


Lisatud : 16.03.2007 17:48:55
Hinne : 5,00 (1)
Vaadatud : 259
Heaks kiidetud : Vladimir Kjahrenov


Kommentaarid (0) 

  

  Hinda...
 

Viimased kommentaarid


 
  Et saaksid kommenteerida pead Sa olema sisse loginud.

   1.11.2007 6:41:56
  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.