XML Schema, XML DTDye karşın güçlü bir alternatif. XML Schema dili XML Schema Definition (XSD) olaraktan adlandırılmakta.

Neden XML Schema dersek;

  • Veri tiplerini destekliyor.
  • XML söz dizimi ile yazılıyor.
  • Güvenli veri iletişimi sağlıyor.
  • Esnek.

<schema> elemanı

Kök eleman olan <schema> elemanıdır.

<xml version="1.0"?>
<xs:schema>
<!-- Kod Blok -->
</xs:schema>

<schema> elemanın etiketleri;

<xml version="1.0"?>
<xs:schema
		xmlns:xs="http://www.w3.org/2001/XMLSchema"
		targetNamespace="https://mehmetcan.sahin.dev"
		xmlns="https://mehmetcan.sahin.dev">
<!-- Kod Blok -->
</xs:schema>

xmlns:xs etiketi http://www.w3.org/2001/XMLSchema standartlarına göre tanımlamalar yapacağımızı belirtiyoruz.

targetNamespace etiketi ile XML içerisinde tanımlaman niteliklerin bu isim uzayından geldiğini belirtir.

xmlns etiketi bu XML bağlı olduğu isim uzayını belirtir.

Referans olarak XSD çağırmak istersek.

<xml version="1.0"?>
<kitaplar xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://mehmetcan.sahin.dev/kitaplar.xsd">
<!-- XML -->

xsi:schemaLocation etiketi olduğu elemanın hangi adresteki XSD uygulayacağını belirtiyor.

Basit Elemanlar

Eleman Tanımlama

XML'deki elemanları XSD tanımlamak için;

<xs:element name="eleman-adi" type="eleman-tipi"/>

Eleman Tipleri:

  • xs:string
  • xs:decimal
  • xs:integer
  • xs:boolean
  • xs:date
  • xs:time

Eleman tiplerini kullanarak kutuphane örneğimizde uygulayalım. Örnek XML:

<xml version="1.0"?>
<adi>Yunus Emre Divanı</adi>    
<yazar>Selim Yağmur</yazar>    
<dil>Türkçe</dil>    
<baski>8</baski>    
<tarih>2014/04/01</tarih>

XSD ile tanımlayalım.

<xs:element name="adi" type="xs:string"/>
<xs:element name="yazar" type="xs:string"/>
<xs:element name="dil" type="xs:string"/>
<xs:element name="baski" type="xs:integer"/>
<xs:element name="tarih" type="xs:date"/>

XSD eleman tanımlarken eğer varsayılan bir eleman ise default, eğer sabit ise fixed kullanırız.

<xs:element name="dil" type="xs:string" fixed="Türkçe"/>
<xs:element name="baski" type="xs:integer" default="1"/>

Etiket Tanımlama

Etiketleri tanımlamak için;

<xs:attribute name="etiket-adi" type="etiket-tipi"/>

Etiket Tipleri:

  • xs:string
  • xs:decimal
  • xs:integer
  • xs:boolean
  • xs:date
  • xs:time

Yine kutuphane örneğimizi kullanalım örnek XML;

<xml version="1.0"?>
<kitap isbn="9759954949">Yunus Emre Divanı</kitap>
<yazar gorev="Derleyici">Selim Yağmur</yazar>

XSD ile etiketlerini tanımlayalım.

<xs:attribute name="isbn" type="xs:integer"/>
<xs:attribute name="gorev" type="xs:string"/>

Kısıtlamalar

Eleman içerisinde olan değerleri kısıtlamak için genel yapı;

<xs:element name="eleman-adi">
	<xs:simpletype>
		<xs:restriction base="eleman-tipi">
			<!-- Kısıtlamalar -->
		</xs:restriction>
	</xs:simpletype>
</xs:element>

Baskısı en az ve en fazla kaç alabileceğini belirlemek için minInclusive ve maxInclusive kullanıyoruz.

<xs:element name="baski">
	<xs:simpletype>
		<xs:restriction base="xs:integer">
			<xs:minInclusive value="1"/>
			<xs:maxInclusive value="500"/>
		</xs:restriction>
	</xs:simpletype>
</xs:element>

Baskı elemanın en az 1 en fazla 500 olarak belirledik.

<xs:element name="yazar">
	<xs:simpletype>
		<xs:restriction base="xs:string">
			<xs:enumeration value="yazar"/>
			<xs:enumeration value="cevirmen"/>
			<xs:enumeration value="derleyici"/>
		</xs:restriction>
	</xs:simpletype>
</xs:element>

Yazarın görev elemanı için 3 seçenek belirliyoruz. Bir tane kısıtlama yazıp bunu bir çok yerde kullanmak için kısıtlamaları tipe çevirmemiz gerek.

<!-- Eleman tanımlarken tip olarak oluşturacağınız kısıtlama adını yazmanız gerek -->
<xs:element name="eleman-adi" type="kısıtlama-adi"/>
<xs:simpletype name="kısıtlama-adi">
	 <xs:restriction base="xs:string">
			<!-- Kısıtlamalar -->
	 </xs:restriction>
</xs:simpletype>
<!-- Örnek -->
<xs:element name="yazar" type="gorevKisitlama"/>
<xs:simpleType name="gorevKisitlama">
	 <xs:restriction base="xs:string">
			<xs:enumeration value="yazar"/>
			<xs:enumeration value="cevirmen"/>
			<xs:enumeration value="derleyici"/>
	 </xs:restriction>
</xs:simpleType>

Desenler belirleyebilirsiniz;

<xs:element name="eleman-ismi">
	<xs:simpletype>
		<xs:restriction base="xs:string">
			<xs:pattern value="desen"/>
		</xs:restriction>
	</xs:simpletype>
</xs:element>

İlk karakteri küçük olan, diğerleri büyük olan bir desen tanımlayalım.

<xs:element name="ad">
	<xs:simpletype>
		<xs:restriction base="xs:string">
			<xs:pattern value="[a-z]([A-Z])*"/>
		</xs:restriction>
	</xs:simpletype>
</xs:element>

Desenler ve açıklamaları

<xs:element name="ad">
	<xs:simpletype>
		<xs:restriction base="xs:string">
			<xs:pattern value="[a-z]"/> <!-- Tek bir karekter ve küçük harfler -->
			<xs:pattern value="[A-Z]"/> <!-- Tek bir karekter ve büyük harfler -->
			<xs:pattern value="[a-zA-Z]"/> <!-- Tek bir karekter ve küçük veya büyük harfler -->
			<xs:pattern value="[a-zA-Z][a-zA-Z]"/> <!-- İki karekter ve küçük veya büyük harfler -->
			<xs:pattern value="xyz"/> <!-- Bir karekter ve x,y,z harflerinden biri -->
			<xs:pattern value="[0-9]"/> <!-- 0'dan 9'a kadar bir rakam -->
			<xs:pattern value="([a-z])*"/> <!-- İstenildiği kadar küçük harfler -->
			<xs:pattern value="([a-z])+"/> <!-- En az bir veya daha fazla harf -->
			<xs:pattern value="ahmet|mehmet"/> <!-- ahmet veya mehmet -->
			<xs:pattern value="([a-z])*"/> <!-- İstenildiği kadar küçük harfler -->
		</xs:restriction>
	</xs:simpletype>
</xs:element>

Yukarıdaki desenleri teker teker deneyiniz. Boşluk işlemleri için;

<xs:element name="ad">
	<xs:simpletype>
		<xs:restriction base="xs:string">
			<xs:whiteSpace value="preserve"/> <!-- #x9, #xA, #xD her hangi bir değişiklik yapmaz.-->
			<xs:whiteSpace value="replace"/> <!-- #x9(tab), #xA, #xD karakterlerini #x20(boşluk) ile değiştir -->
			<xs:whiteSpace value="collapse"/> <!-- Boşlukları kaldırır -->
		</xs:restriction>
	</xs:simpletype>
</xs:element>

Karakter uzunluğu işlemleri için;

<xs:element name="ad">
	<xs:simpletype>
		<xs:restriction base="xs:string">
			<xs:length value="5"/> <!-- Kaç karekter olması gerektiğini belirtiyor -->
			<xs:minLength value="1"/> <!-- En az az kaç karekter olması gerektiğini belirtiyor -->
			<xs:maxLength value="10"/> <!-- En fazla kaç karekter olması gerektiğini belirtiyor -->
		</xs:restriction>
	</xs:simpletype>
</xs:element>

Kısıtlamalarda kullanılan tipler;

  • enumeration : kabul edilen değerler
  • fractionDigits : 2.4 burada . sonraki kaç sayı alacağını belirliyoruz.
  • length : kaç karakter alacağını belirliyoruz
  • maxExclusive : en fazla kaç sayısal değer alacağını belirliyoruz (belirtilen değerden az olması gerekir)
  • maxInclusive : en fazla kaç sayısal değer alacağını belirliyoruz (belirtilen değerden az veya eşit olması gerekir)
  • maxLength : en fazla kaç karakter alacağını belirliyoruz
  • minExclusive : en az kaç sayısal değer alacağını belirliyoruz (belirtilen değerden fazla olması gerekir)
  • minInclusive : en az kaç sayısal değer alacağını belirliyoruz (belirtilen değerden fazla veya eşit olması gerekir)
  • minLength : en az kaç karakter alacağını belirliyoruz
  • pattern : desen belirleyip ona göre değer almasını sağlıyoruz
  • totalDigits : toplamda kaç karakter olması gerektiğini belirliyoruz
  • whiteSpace : beyaz alan ile ilgili durumları belirliyoruz