XML Schema Giriş ve Basit Tipler
XML Schema Definition'ın ne olduğunu, DTD'ye göre farklarını ve XSD basit tiplerinin nasıl çalıştığını öğrenin.
XML Schema, XML DTD'ye güçlü bir alternatif. XML Schema dili, XML Schema Definition (XSD) olarak adlandırılır.
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, XML içinde tanımlanan 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="http://www.w3schools.com https://mehmetcan.sahin.dev/kitaplar.xsd">
<!-- XML -->
</kitaplar>
xsi:schemaLocation etiketi XML isim uzayını doğrulama için kullanılacak XSD dosyasıyla eşler.
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"?>
<kitap>
<adi>Yunus Emre Divanı</adi>
<yazar>Selim Yağmur</yazar>
<dil>Türkçe</dil>
<baski>8</baski>
<tarih>2014-04-01</tarih>
</kitap>
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">
<yazar gorev="Derleyici">Selim Yağmur</yazar>
</kitap>
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 karakter ve küçük harfler -->
<xs:pattern value="[A-Z]"/> <!-- Tek bir karakter ve büyük harfler -->
<xs:pattern value="[a-zA-Z]"/> <!-- Tek bir karakter ve küçük veya büyük harfler -->
<xs:pattern value="[a-zA-Z][a-zA-Z]"/> <!-- İki karakter ve küçük veya büyük harfler -->
<xs:pattern value="xyz"/> <!-- Bir karakter 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 herhangi 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ç karakter olması gerektiğini belirtiyor -->
<xs:minLength value="1"/> <!-- En az kaç karakter olması gerektiğini belirtiyor -->
<xs:maxLength value="10"/> <!-- En fazla kaç karakter 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