XML Schema (XSD) – Nedir? Neden ve Nasıl Kullanılır?

XML-Schema-XSD

XML Schema Nedir?

XML belge içeriği ile ilgili kuralları belirtmenin farklı yolları vardır. Bunlardan biri olan DTD (Document Type Definition) yani belge türü tanımı ile ilgili temel bilgileri, söz dizimini ve nasıl kullanılacağını DTD Nedir? – XML’de Document Type Definition yazımızda işlemiştik. XML schema da bir XML belgesi için kurallar veya kısıtlamalar belirtmenin bir diğer yoludur.

XML schema, XML belgesinin yapısının nasıl olacağını tanımlamaya yarayan yani XML belgesi ile ilgili kuralları belirtmek için kullanılan ayrı XML tabanlı bir dildir. Dosya uzantısı “.xsd” şeklindedir. XSD, XML Scheme Definition ifadesinin kısaltmasıdır.

W3C tarafından “XML belgeleri hakkındaki kısıtlamaları anlatan bir dil” olarak tanımlanır. XML schema’nın kendisi de bir XML belgesidir! Genellikle kullanılacak XML belgesinden bağımsız bir .xsd dosyası olarak saklanır.

XML schema, XML belgelerini ifade etmek için içeriği ve yapıyı tanımlayan bir belgeyi ifade eder. Yapısal ilişkiler, önem düzeyi, geçerli değerler ve veri türleri gibi ek meta veri özellikleri için destek sağlar. Bir XML belgesinde kurallar ve kısıtlamalar uygulama yöntemidir. Veri özelliklerini tanımlamamıza olanak sağlar. XML Schema, şema uyumlu bir belgede bulunabilecek öğeleri, öznitelikleri ve öğelerin bir belge yapısı içinde nasıl düzenleneceğini açıklar.

Schema (Şema) Dilleri

Bu amaçla kullanılabilecek farklı şema dilleri vardır. Bunlar:

  • DTD
  • Relax-NG
  • Schematron
  • ve W3C XSD’dir.

DTD, XML’nin geleneksel schema tanımı olsa da işlevlerinin ve tanımlarının sınırlı olduğunu görüyoruz. Burada daha çeşitli amaçlar için kullanılabilecek, XML Schema Definition (XSD) olarak adlandırılan ve W3C tarafından tanımlanan temel schema dilini göreceğiz.

XML Schema Neden Kullanılır?

DTD’de olduğu gibi bir XML schema bildirimine göre düzenlenmiş bir XML belgesi valid (geçerli) bir belge olarak adlandırılır. Bir XML belgesi söz dizimine uygun bir şekilde hazırlandığı için iyi biçimlendirilmiş (well formed) olabilir ancak geçerli bir belge olması için DTD veya schema’da belirtilen kurallara uygun olması gereklidir.

XML schema, ilişkisel veri tabanı tablosunun tanımına çok benzer. Bir XML schema’da, XML belgesinin yapısını, öğelerini, öğelerin veri türlerini ve ilişkili öznitelikleri ve en önemlisi, öğeler arasındaki ebeveyn-çocuk ilişkilerini tanımlarız. XML Schema XML tabanlı olduğu için daha kullanışlı ve daha güçlüdür. Birçok standart schema’lar tarafından tanımlandığı için önemlidir. XSD’ler şema nesnelerini tanımlamamızı sağladığı için bu nesnelere göre otomatik olarak sınıf üreterek kolaylık sağlayan araçlar da bulunmaktadır. XML schema genel olarak;

  • XML schema öğelerin ve özniteliklerinin (attributes) listesini sağlamak için,
  • Dokümanda bulunan verileri türlerine göre ilişkilendirmek için,
  • Öğelerin veya özniteliklerinin nerede görülebileceğini ve bu öğelerin içinde neyin görünebileceğini kısıtlamak için,
  • XML belgelerinin resmi bir tanımını sağlamak için kullanılabilir.

Özet olarak; XML schema (XSD), bir XML belgesinin yapısını tanımlar. Bir XML belgesinde görünebilecek öğeleri ve nitelikleri ve bu öğelerin ve niteliklerin içerebileceği veri türünü belirtir. Bu bilgi, bir XML belgesindeki her öğenin veya özniteliğin açıklamasına uyduğunu doğrulamak için kullanılır.

XML Schema Tanımı

Tamamen XML tabanlı olduğu için XML schema için de tamamen XML söz dizimi geçerlidir. Yani XML schema da “extensible” bir dildir. Dolayısıyla tüm XML editörlerini veya işleyicilerini XML schema’lar için de kullanabiliriz. Ancak bir schema’ kök öğe “schema”dır:

<?xml version="1.0"?>

<xs:schema>

  ...

  ...

</xs:schema>

Bir schema’yı aşağıdaki gibi bir XML belgesinde bildirimini yapabiliriz:

<?xml version="1.0"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"

targetNamespace="https://www.arakatman.com"

xmlns="https://www.arakatman.com"

elementFormDefault="qualified">

  ...

  ...

</xs:schema>

XML Schema’yı Oluşturan Parçalar

XML schema’yı oluşturan bu parçaları teker teker açıklayalım:

<xs:schema xmlns:xs=”http://www.w3.org/2001/XMLSchema” ⇒ Schema’da kullanılan öğeleri ve veri türleri burada belirtilen namespace’ten (xs) geldiği anlamına gelir. Ayrıca buradan gelen öğeler ve veri türlerinin önüne xs eklenmesi gerektiği belirtilmiş olur. (Burada xsd ad alanı da kullanılabilir ama aralarında bir fark yoktur.)

targetNamespace=”https://www.arakatman.com” ⇒ Bu schema tarafından tanımlanan öğeler bu ad alanından gelir.

xmlns=”https://www.arakatman.com” ⇒ Varsayılan ad alanı burası olduğu anlamına gelir.

elementFormDefault=”qualified” ⇒ Schema’da kullanılan tüm öğeler ad alanına uygun olmalıdır.

Peki bir XML belgesinde XML şemasını nasıl referans olarak verebiliriz?

<?xml version="1.0" encoding="utf-8"?>

<ileti xmlns="https://www.w3.org"

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

xsi:schemaLocation="https://www.w3.org/2009/XMLSchema/XMLSchema.xsd">

  <ad>Ahmet</ad>

  <eposta>Ahmet@a.com</eposta>

  <kategori tur="soru"></kategori>

  <konu>XML Schema nedir?</konu>

  <mesaj>XML Schema tam olarak nedir?</mesaj>

</ileti>

XML Schema’da Öğeler (Elements)

XML schema ile bir XML belgemizde hangi öğelerin olması gerektiğini belirleyebiliriz.

Öğeler 3 farklı türde olabilir:

  • Basit öğe (simple type)
  • Karmaşık öğe (complex type)
  • Herhangi türde öğe (any type)

Basit Öğe – SimpleType:

Sadece metin içeren öğedir. Basit öğeler xs:element verilerek şu şekilde tanımlanır.

Örnek:

<konu>XML Schema nedir?</konu> öğesi için XML schema’daki tanımlama:

<xs:simpleType name="oge1">
<xs:restriction base="xs:integer">
<xs:minInclusive value="8"/>
<xs:maxInclusive value="12"/>
<xs:pattern value="\d{1,2}"/>
</xs:restriction>
</xs:simpleType>

Artık oge1 isminde bir öğenin olması gerektiğini ve bu öğenin türünün string olacağını diğer kısıtlamalarla birlikte schema’da belirtmiş oluyoruz. En bilinen yerleşik veri türleri string, integer, decimal, boolean, date, time şeklindedir. Bu türlerden başka özel olarak tanımlanmış başka türler de varsa burada tür olarak kullanılabilir.

Karmaşık Öğe – ComplexType:

Karmaşık bir öğe, diğer öğeleri ve/veya nitelikleri içeren bir XML öğesidir. ComplexType türündeki bir öğe metin, öğe ve öznitelik (attribute) içerebilir. Aynı zamanda boş öğe de karmaşık öğe olabilir.

Örnek:

<xs:complexType name="KarmasikOgeninIsmi">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="urun1" type="Oge1"/>
<xs:element name="urun2" type="Oge2"/>
<xs:element name="urun3" type="Oge3"/>
</xs:choice>
</xs:complexType>

Herhangi Türde Öğe – AnyType:

Tüm ComplexType ve simpleType veri türleri anyType’tan türetilmiştir. Dolayısıyla, anyType, tüm simpleTypes ve ComplexTypes veri türlerinin temel türüdür. Tanımda veri türünü belirtmeden anyType türünde bir öğe oluşturabilirsiniz. anyType öğesinin içeriğini kısıtlayamazsınız.

AnyType türündeki bir öğe, dönüşümler yapılırken yalnızca anyType türündeki bir öğeyle eşlenebilir. xsd:anyType, xsd:integer gibi bir türdür. xsd:anyType, basit veya karmaşık bir tür olarak hareket edebilmesi bakımından özeldir ve doğruladığı yerde esasen hiçbir kısıtlama getirmez.

Eğer bir öğeyi herhangi bir veri türüyle kısıtlamak istemezseniz bu xsd:anyType’ı kullanabilirsiniz.

Örnek:

<xsd:element name="oge1" type="xsd:anyType"/>

Bu, oge1 adlı öğelerin herhangi bir içeriğe, herhangi bir niteliğe vb. sahip olabileceği anlamına gelir.

Öğelerde Default Veya Fixed Değerler

Basit öğeler default (varsayılan) ya da fixed (sabit) değerler alabilir. Varsayılan değer eğer özel bir değer verilmezse otomatik olarak atanacaktır.

Örnek:

<xs:element name="kategori" type="xs:string" default="soru"/>

Artık kategori ismindeki öğenin varsayılan değeri “soru”dur.

Fixed yani sabit değer de aynı şekilde otomatik olarak atanır ve bu değer değiştirilemez.

Örnek:

<xs:element name="copyright" type="xs:string" fixed="www.arakatman.com"/>

XML Schema’da Öznitelikler/Öğenin Özellikleri (Attributes)

Basit öğeler öznitelik alamaz. Eğer bir öğe öznitelik almışsa ya da en az bir alt öğesi varsa buna complex element yani karmaşık öğe denir. XML schema’da öznitelikler xs:attribute verilerek şu şekilde tanımlanır:

<xs:attribute name="oznitelikadi" type="oznitelikturu"/>

Öznitelik türleri de öğeler gibi aynı yerleşik türler olabilir. Bu yerleşik türler olabileceği gibi özel farklı türler de olabilir.

Örnek:

<xs:attribute name="version" type="xs:token"/>
Özniteliklerde Default Veya Fixed Değerler:

Burada da öğelerde olduğu gibi default anahtar kelimesi verilerek varsayılan (default) veya sabit (fixed) değerde öznitelik verilebilir.

Örnek:

<xs:attribute name="renk" type="xs:string" default="mavi"/>
Özniteliklerde Optional Veya Required Değerler:

Öznitelikerde zaten varsayılan olarak optional yani isteğe bağlıdır ancak bir öznitelik gerekli ise use=”required” şeklinde schema’da belirtilir.

Örnek:

<xs:attribute name="renk" type="xs:string" use="required"/>

XML Schema’da Kısıtlamalar

Bir öğe için veya öznitelik için veri türü belirtilmişse doğal olarak burada bir kısıtlama getirilmiş demektir. Yani değerin burada belirtilen tür olması gerekir (string ise string bir veri, date ise date türünde veri gibi.) Bunlara ek olarak kendimiz de farklı kısıtlamalar getirebiliriz.

Değer Üzerinde Kısıtlamalar

Aşağıdaki örnekte “age” isminde tanımlanan öğenin en küçük değerinin 0 en büyük değerinin 120 olacağı şekilde bir kısıtlama getirilmektedir:

<xs:element name="age">
  <xs:simpleType>
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="0"/>
      <xs:maxInclusive value="120"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>
Değer Kümesi Üzerinde Kısıtlamalar

Burada kullanılan xs:enumeration kısıtlamasına göre “car” öğesi sadece burada belirtilen değerleri alabilir. (Burada ayrıca “carType” adında farklı bir tür tanımlanmıştır ve öğeye bu tür verilmiştir.)

<xs:element name="car" type="carType"/>
<xs:simpleType name="carType">
<xs:restriction base="xs:string">
<xs:enumeration value="Audi"/>
<xs:enumeration value="Golf"/>
<xs:enumeration value="BMW"/>
</xs:restriction>
</xs:simpleType>
Değer Dizisi Üzerinde Kısıtlamalar

Bir desen kısıtlaması kullanılarak belirli bir diziyi kısıtlama olarak verebiliriz. Aşağıdaki örnek “letter” öğesinin alabileceği değerler a ile z arasındaki küçük harflerden biridir.

<xs:element name="letter">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:pattern value="[a-z]"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

Buradaki desen kısıtlaması şu şekillerde de kullanılabilir:

<xs:pattern value=”[a-z] [a-z] [a-z]”/> ⇒ ilk 3 harfin belirtilen küçük harf dizisinden olması gerekir.

<xs:pattern value=”[a-zA-Z][a-zA-Z][a-zA-Z]”/> ⇒ ilk 3 harf büyük veya küçük harflerden biri olması gerekir.

<xs:pattern value=”[xyz]”/> ⇒ Öğe sadece x, y veya z değerlerinden birini alabilir.

<xs:pattern value=”([a-z])*”/> ⇒ * karakteri ile bu değer boş olabilir ya da belirtilen dizideki küçük harflerden birini alabilir anlamına gelmektedir.

<xs:pattern value=”([a-z][A-Z])+”/> ⇒ + karakteri bir veya birden fazla küçük ve büyük harf çifti olması gerektiğini gösterir.

<xs:pattern value=”[0-9][0-9][0-9][0-9][0-9]”/> ⇒ öğe 5 rakamdan oluşmalı ve belirtilen aralıktaki değerleri alabilir.

<xs:pattern value=”a|b”/> ⇒ öğe bu iki değerden birini alabilir.

<xs:pattern value=”[a-zA-Z0-9]{8}”/> ⇒ Bu öğenin değeri tam olarak 8 karakterden oluşmalı ve küçük harf, büyük harf ve 0’dan 9’a bir rakam içermelidir.

<xs:whiteSpace value=”preserve”/> ⇒ Bu kısıtlamayı alan öğede boşluk karakteri korunacaktır yani silinmeyecektir. Preserve yerine “replace” değeri kullanılırsa tüm boşluk karakterleri (tab gibi) boşlukla değiştirilecektir. “collapse” değeri kullanıldığı takdirde tüm boşluk karakterleri kaldırılacaktır.

Uzunluk Üzerinde Kısıtlamalar

Bir öğedeki bir değerin uzunluğunu sınırlamak için length, maxLength ve minLength kısıtlamalarını kullanırız. Aşağıdaki örnekte öğenin karakter sayısı tam olarak 8 olmalıdır

<xs:element name="password">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:length value="8"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

Buradaki örnekte ise öğenin karakter değeri 5 ile 8 arasında olmalıdır:

<xs:element name="password">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:minLength value="5"/>
      <xs:maxLength value="8"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>
Veri Türleri Üzerinde Kısıtlamalar
Kısıtlama Açıklama
enumeration Kabul edilebilir değerlerin bir listesini tanımlar.
fractionDigits İzin verilen maksimum ondalık basamak sayısını belirtir. Sıfıra eşit veya daha büyük olmalıdır.
length İzin verilen karakter veya liste öğelerinin tam sayısını belirtir. Sıfıra eşit veya daha büyük olmalıdır.
maxExclusive Sayısal değerler için üst sınırları belirtir (değer, bu değerden küçük olmalıdır.)
maxInclusive Sayısal değerler için üst sınırları belirtir (değer, bu değerden küçük veya ona eşit olmalıdır.)
maxLength İzin verilen maksimum karakter veya liste öğesi sayısını belirtir. Sıfıra eşit veya daha büyük olmalıdır.
minExclusive Sayısal değerler için alt sınırları belirtir (değer, bu değerden büyük olmalıdır.)
minInclusive Sayısal değerler için alt sınırları belirtir (değer, bu değerden büyük veya bu değere eşit olmalıdır.)
minLength İzin verilen minimum karakter veya liste öğesi sayısını belirtir. Sıfıra eşit veya daha büyük olmalıdır.
pattern Kabul edilebilir karakterlerin tam sırasını tanımlar.
totalDigits İzin verilen basamak sayısını kesin olarak belirtir. Sıfırdan büyük olmalıdır.
whiteSpace Boşluk karakterinin (line feed, sekmeler, boşluklar ve satır başı) nasıl işleneceğini belirtir.
Öğeler ve Nitelikler için Oluşum Kısıtlamaları
Kısıtlama Açıklama
minOccurs minOccurs özelliği, öğenin minimum kaç kez oluşabileceğini belirtir. 0 değerine veya herhangi bir pozitif tam sayıya sahip olabilir.
maxOccurs maxOccurs özelliği, öğenin maksimum kaç kez oluşabileceğini belirtir. minOccurs özniteliğinin değerinden büyük veya buna eşit herhangi bir pozitif tamsayı değerine sahip olabilir. Ayrıca öğenin oluşabileceği sayı için hiçbir üst sınırın geçerli olmadığını gösteren sınırsız bir değer alabilir. Her iki öznitelik için varsayılan değer 1’dir.
fixed Opsiyonel bir özelliktir. Öğenin sabit bir değer alacağını belirten bir özniteliktir. Default ve fixed öznitelikler aynı anda olamaz.
default Opsiyonel bir özelliktir. Öğenin varsayılan bir değer alacağını belirtir.
use

Opsiyonel bir özelliktir. Aşağıdaki değerlerle kullanılabilir:

use=”optional” ise öğe isteğe bağlıdır (bu zaten varsayılandır.)

use=”prohibited” ise bu özniteliğe sahip öğe kullanılamaz.

use=”required” ise bu özniteliğe sahip öğe gereklidir.

XML Schema İle DTD Arasındaki Farklar (XSD’nin DTD’ye Göre Avantajları)

» XML schema ile DTD arasında belki de en önemli fark şudur; XML tabanlıdır yani schema da “extensible” bir dildir yani XSD genişletilebilir. Mevcut öğelerden yeni öğeler türetebilirsiniz. DTD genişletilebilir değildir.

» DTD SGML tabanlıdır. Dolayısıyla XSD daha kullanışlıdır. DTD’nin kullanımı kullanıcı için daha zordur.

» DTD veri türlerini desteklemez ancak XML schema’da öğeler ve öznitelikler için veri türü tanımlanabilir. XSD veri türlerini destekler. Bir öğenin içeriğini kısıtlayabilirsiniz. DTD veri türlerini desteklemediği için bir öğenin içeriğini kısıtlayamazsınız.

» XML schema’larda ad alanı kullanımına izin verilir ancak DTD’de bu yapılamaz.

» XML schema varsayılan değerleri destekler. Öğelerin varsayılan değerlerini belirtebilirsiniz. DTD’de öğelerin varsayılan değerlerini belirtemezsiniz.

» XML schema’da alt öğeler için numaralandırma veya sıralama yapılabilir.

» XSD’de ayrıştırıcı (parser) tarafından ara işlem gerektirmez. DTD, XML olarak tanımlanmamıştır. DTD ve XML için ayrı ayrıştırıcılara ihtiyaç bulunmaktadır.

» XSD, harici XML şemalarına referansları destekler. Bir XML şemasına birden fazla XML şeması ekleyebilir veya içe aktarabilirsiniz. Bir DTD’ye başka DTD’leri dahil edemezsiniz.

» XML schema XML DOM ile kendi başınıza manipüle edilebilir, ancak DTD’de mümkün değildir.

» XML schema güvenli veri iletişimini sağlar yani veriler bunları işleyecek tarafın anlayacağı şekilde tanımlanabilir.

» Ek olarak; DTD XML belgelerinde kullanılmak üzere yeni ENTITY’ler tanımlamamıza olanak verir.

Son olarak; XSD sadece bunlarla sınırlı değildir. XML Schema’ya ait tüm şema öğelerini detaylı incelemek için W3C’ye ait W3C XML Schema Spec Part 1 ve W3C XML Schema Spec Part 2 adreslerini inceleyebilirsiniz.

Örnek bir XML schema dosyasına da (XMLSchema.xsd) W3C adresinden göz atabilirsiniz.

Bu yazı size ne kadar faydalı oldu?

Değerlendirmek için bir yıldıza tıklayın!

Yazının sizin için faydalı olmadığını duymaktan dolayı müteessiriz...

Bu yazıyı geliştirmek isteriz!

Bu yazıyı nasıl geliştirebileceğimizi paylaşmak ister misiniz?