14 Ekim 2008 Salı

XML dosyalarinin gecerliligini Schema dosyasi kullanarak kontrol etmek (Validate an XML Document using Schema)

Bir XML dosyanin icerigini kontrol etmek icin schema dosyalarindan faydalanabiliriz.
XML schema dosyasi, XML dosyasinin iceriginin sahip olmasi gereken kurallari tanimlayan, uzantisi XSD (XML Schema Definition) olan dosyalardir.

XSD icerisnde bahsedilen kurallar sunlardir;

- XML dosyasi icinde var olmasi beklenen element ve attibute'ler, bunlara ait olan data tipleri.
- XML dosyasinin yapisi. Elementler ve bu elementlere ait olan child element'ler.
- Child elementlerin sayisi ve sirasi.
- Element'lerin bir text degere sahip olup olmayacagi.

XSD dosyalar icinde tanimlanan element'ler "simple" ve "complex" type olmak üzere ikiye ayrilir. Sadece karakter data barindan element'ler simple type olarak ifade edilir. Elementler onlara bagli olan alt elementlere (nested elements) sahip ise bu tip elementlerde complex type olarak isimlendirilir.

Asagidaki örnekde ProductCatalog.xml dosyasinin, ProductCatalog.xsd dosyasi kullanilarak nasil validate edilecegini görelim. Bu iki dosyanin icerigi asagidaki gibi olacakdir.

ProductCatalog.xml:


ProductCatalog.xsd:


Asagidaki örnek consol uygulamasinda XML dosyanin gecerliligini XSD kullanarak nasil denetlicegimizi görelim:

using System;
using System.Xml;
using System.Xml.Schema;

public class ValidateXml
{
private static void Main()
{
// XmlValidator sinifimiz icerisinde XMLReader sinifi kullanilarak dogrulama islemi yapilacak.
XmlValidator validator = new XmlValidator();
Console.WriteLine("ProductCatalog.xml dogrulama islemi...\n");

//Xml ve Xsd dosyalari uygulamamizin calistigi dizinde.
bool success = validator.ValidateXml("ProductCatalog.xml", "ProductCatalog.xsd");
if (!success)
Console.WriteLine("XML dosyasi icerigi dogrulanamadi!");
else
Console.WriteLine("XML dosyasi icerigi uygun.");

Console.ReadLine();
}
}

public class XmlValidator
{
private bool failed;

public bool Failed
{
get {return failed;}
}

public bool ValidateXml(string xmlFilename, string schemaFilename)
{
// Schema tipinde dogrulama (validation) yapacagimizi tanimliyoruz.
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.Schema;

// Schema dosyasi yükleniyor..
XmlSchemaSet schemas = new XmlSchemaSet();
settings.Schemas = schemas;
// ilk parametre de kendimiz bir target namespace girebiliriz validate islemi icin
// null olarak birakildiginda "targetNamespace" degeri schema dosyasindan alinir.
schemas.Add(null, schemaFilename);

// Dogrulama yapilirken hata olustugunda calisacak event handler tanimlaniyor.
settings.ValidationEventHandler += ValidationEventHandler;

//Schema ayarlari ile birlikte xml dosyasi okunmak üzere XMLReader nesnesi olusturuluyor.
XmlReader validator = XmlReader.Create(xmlFilename, settings);

failed = false;
try
{
// XML dosyasi icerisindeki tüm datalar okunuyor.
while (validator.Read())
{}
}
catch (XmlException err)
{
// XML dosyasi icersinde gecersiz bir karakter oldugunda yada acilmis bir tag dogru sekilde kapatilmadiginda hataya düser.
Console.WriteLine(err.Message);
failed = true;
}
finally
{
validator.Close();
}

return !failed;
}

private void ValidationEventHandler(object sender, ValidationEventArgs args)
{
failed = true;
// Dogrulama (Validation) hatasini ekrana yazdir.
Console.WriteLine("XML Dogrulama Hatasi: " + args.Message);
}
}


Uygulamayi calistirdigimizda console ekraninda asagidaki ciktiyi aliriz;

ProductCatalog.xml dogrulama islemi...

XML Dogrulama Hatasi: The element 'product' has invalid child element 'description'. List of possible elements expected: 'productPrice'.
XML Dogrulama Hatasi: The element 'product' has invalid child element 'description'. List of possible elements expected: 'productPrice'.
XML dosyasi icerigi dogrulanamadi!



Bu hatanin olusup dogrulama isleminin gerceklesmemesinin nedeni, ProductCatalog.xsd dosyasi icerisinde "complex type product tanimlamasi" altinda belirlenen elementlerde description isimli bir element in tanimlanmamasi, fakat ProductCatalog.xml dosyasindaki node'lar icerisinde description isimli bu elementin var olmasidir.

ProductCatalog.xsd dosya icerisinden

<xsd:element name="productPrice" type="xsd:decimal"/>

satirini sildigimizde, XML dosyanin iceriginin kullanilan schema dosyasina uygun oldugunu ve dogrulama isleminin hatasiz sekilde tamamlandigini görürüz.

Kaynak: Apress Visual C# 2005 Recipes

Hiç yorum yok: