Özkan Kaya
Bilgiye sahip olarak doğmuş birisi değilim. Öğretmeyi seviyorum ve öğrenmeye çalışıyorum.

XML Şemaları

Cumartesi, 20 Şubat 2010 15:04 by ozkankaya

Farklı platformlar arasında XML olarak taşınan verinin doğruluğunu sağlamak ve bu verinin tanımlayacağımız bazı kurallara uygun olmasını isteriz. Bu durumda; DTD (Document Type Definition), XDR (XML Data Reduced) ve XSD (XML Schema Definition) şemalar sayesinde XML verimizin sırası, sınırlaması, türü, formatı gibi bir çok özelliğini kontrol altına alabiliriz. Bu sayede daha veri transfere başlanmadan hata payını minimuma indirmiş oluruzki, buda farklı sistemler arasında veri taşıma işinde bize çok büyük yarar getirmektedir. En basitinden hatalı veri göndermenin önüne geçerek   hem hatalı verinin kayıt altına alınması, hem işlemci ile ağ sistemimizde gereksiz  yük potansiyelinin önüne geçmiş oluruz. XSD günümüzde en etkin kullanılan veri modellemelerindendir. Bir XSD dökümanı nasıl oluşturulur ve bunu XML dökümanlarımızda nasıl kullanacağımızı görelim.

İlk önce bir XML veri modelimizi belirleyelim.

<?xml version="1.0" encoding="utf-8" ?>
<Store>
    <Album ID="1">
        <Name>
            Speak & Spell
        </Name>
        <Description>
            ...
        </Description>
        <Price>
            20.00
        </Price>
        <Singers>
            <Singer>Depeche Mode</Singer>
        </Singers>
        <Date>01/04/1981</Date>
    </Album>
</Store>

Bu XML modelinde bir müzik mağazası ve bu mağazada müzik albümlerinin adı, yılı, fiyatı ve söyleyen gibibir takım bilgiler içermektedir. Bu veri modelimizi  belli kurallara bağlamazsak bir çok hata olabilir. Örneğin fiyat alanının yazı ile yirmi yazılabilir olması yada 20 USD. Mesela şarkıcını  adı veya albümün adının boş bırakılması gibi bir takım eksik yada hatalı formatta bilgiler içerebilir. İşte tam bu noktada XSD yardımımıza koşuyor. XSD dokumanlarimizi bir çok editör aracılığı ile oluşturabiliriz. Bu editörlerden kimisi size görsel olarak üzenleme ortamı sağlamaktadır, fakat herhangi bir text editöründende oluşturabilirsiniz.

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="Store">
    <xs:element name="Store">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Album" minOccurs="1" maxOccurs="unbounded">
                    <xs:complexType>                        
                        <xs:sequence>
                            <xs:element name="Name" type="xs:string"></xs:element>
                            <xs:element name="Description" type="xs:string"></xs:element>
                            <xs:element name="Price" type="xs:double"></xs:element>
                            <xs:element name="Singers" minOccurs="1" maxOccurs="1">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="Singer" type="xs:string"></xs:element>
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="Date" type="xs:date"></xs:element>
                        </xs:sequence>
                        <xs:attribute name="ID" type="xs:string" use="required"></xs:attribute>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    
</xs:schema>

Yukarıdaki XSD dökümanımıza baktığımızda aslında XML yapısında. İfadesine "<?xml..." seklinde başladığını görüyoruz. Sonra dikkat edeceğiniz üzere her ifade "<xs:..." seklinde tanimlaniyor. XSD nin betimleside budur. Simdi yukaridaki XSD tanımımıza dönecek olursak; "<xs:schema id="Store">" ifadesi ile Store kimliginde schema olusturmaya basliyoruz, ve "<xs:element name="Store">" ile XML veri modelimizde ilk root elemanimizin adininda Store oldugunu belirtecek bir XSD eleman yaratiyoruz. Daha sonra Store elemanimizin bir kompleks tip oldugunu yani icerisinde baska elemanlar icerdigini "<xs:complexType>" ifadesi ile belirtiyoruz. Bu ifade sonrasında "<xs:sequence>" ilede düzenli bir sırada elemanların tanımlanması gerektiğini belirtiyoruz. Daha sonrada sırasıyla diğer elemanlarımızı tanımlıyoruz. Eleman tanımlarımızda minOccurs ve maxOccurs ifadeleri yer almaktadır, bu ifadeler ilgili elemanın hangi aralıkta değer alacağını ifade eder, type ise elemanın veri tipini ifade eder. XSD dökümanında bunlar bir çok ifade daha yer almaktadır.

Buraya kadar iki farklı döküman oluşturduk fakat bu dökümanların birbirine etkileşimi sağlanmamıştır. Bunu gerçekleştirmek için önce XSD belgemizi aşağıdaki gibi tekrar düzenlememiz gerekir.

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="Store"
    targetNamespace="http://OzkanKaya.com/XmlValidations"
    elementFormDefault="qualified"
    xmlns="http://OzkanKaya.com/XmlValidations"
    xmlns:mstns="http://tempuri.org/Store.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
    <xs:element name="Store">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Album" minOccurs="1" maxOccurs="unbounded">
                    <xs:complexType>                        
                        <xs:sequence>
                            <xs:element name="Name" type="xs:string"></xs:element>
                            <xs:element name="Description" type="xs:string"></xs:element>
                            <xs:element name="Price" type="xs:double"></xs:element>
                            <xs:element name="Singers" minOccurs="1" maxOccurs="1">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="Singer" type="xs:string"></xs:element>
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="Date" type="xs:date"></xs:element>
                        </xs:sequence>
                        <xs:attribute name="ID" type="xs:string" use="required"></xs:attribute>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    
</xs:schema>

Yukaridaki degisiklige baktığımızda bunu uygulayacak XML veri modelimizdeki elemanlar için targetNamespace ifadesi ayarlanıyor. Bu ifade tanımına görede aşağıdaki gibi XML veri modelimizdeki namespaceler ekleniyor.

<Store xmlns="http://OzkanKaya.com/XmlValidations"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema"
       xsi:schemaLocation="http://OzkanKaya.com/XmlValidations Store.xsd"
       xmlns:n2="http://www.w3.org/2001/XMLSchema-instance"
       n2:schemaLocation="http://OzkanKaya.com/XmlValidations Store.xsd">
    <Album ID="1">
        <Name>
            Speak & Spell
        </Name>
        <Description>
            ...
        </Description>
        <Price>
            20.00
        </Price>
        <Singers>
            <Singer>Depeche Mode</Singer>
        </Singers>
        <Date>01/04/1981</Date>
    </Album>
</Store>

Böylece iki dökümanımız birbiri ile etkileşimi gerçekleşmiş oluyor. XML dökümanını açıp içinde yeni veriler eklemeye çalıştığınızda göreceksinizki, XSD de tanımladığınız elemanlar eşliğinde dökümanınız elemanları sırasıyla ve düzgün veri girmenizi isteyecektir.

Bu iki dökümanımızı  C# kodumuzda nasıl etkileşimlerini sağlayacağınızıda aşağıdaki örnekten faydalanabilirsiniz.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;

namespace XmlValidations
{
    class Program
    {
        private static StringBuilder errors;

        static void Main(string[] args)
        {
            StreamReader srXML = System.IO.File.OpenText("Store.xml");
            StreamReader srXSD = System.IO.File.OpenText("Store.xsd");
            string xmlFile = srXML.ReadToEnd();
            string XSDFile = srXSD.ReadToEnd();

            errors = new StringBuilder();

            XmlReaderSettings xrs = new XmlReaderSettings();
            xrs.ValidationEventHandler += new System.Xml.Schema.ValidationEventHandler(xrs_ValidationEventHandler);
            xrs.Schemas.Add(null, XmlReader.Create(XSDFile));
            xrs.ValidationType = ValidationType.Schema;
            XmlReader reader = XmlReader.Create(xmlFile, xrs);
            while (reader.Read())
            { }
            if (errors.ToString() == "")
                Console.WriteLine("Not error.");
            else
                Console.WriteLine(errors.ToString());
        }

        static void xrs_ValidationEventHandler(object sender, System.Xml.Schema.ValidationEventArgs e)
        {
            if (e.Severity == System.Xml.Schema.XmlSeverityType.Error)
                errors.Append(e.Message);
        }
    }
}

 

XmlValidations.rar (19,62 kb)

Tags:   ,
Categories:   Makaleler | Örnek Kodlar
Actions:   E-mail | del.icio.us | Permalink | Yorumlar (0) | Comment RSSRSS comment feed