Merhaba Webkolog takipçileri!
Bugün sizlerle XML Schema Definition (XSD) konusunu derinlemesine inceleyeceğiz. XML'in veriyi yapılandırma gücünü daha da ileri taşıyan XSD, XML dokümanlarınızın belirli kurallara ve yapılara uygunluğunu sağlamanın en modern ve kapsamlı yoludur. DTD'ye göre çok daha yetenekli olan XSD, veri tiplerinden, element sayılarına kadar birçok detayı kontrol etmemize olanak tanır. Hazırsanız, bu önemli konuyu birlikte keşfedelim!
---XSD Nedir ve Neden Kullanılır?
XSD (XML Schema Definition), bir XML dokümanının yapısını ve içeriğini tanımlamak için kullanılan, kendisi de XML tabanlı bir dildir. XSD, bir XML belgesinin "geçerli" olup olmadığını belirleyen kuralları içerir. Yani, belirli bir XML belgesinin hangi elementleri, hangi nitelikleri içerebileceğini, bunların hangi sırayla ve kaç kez tekrar edebileceğini, hatta içerdikleri verilerin tiplerini (sayı, metin, tarih vb.) ve değer aralıklarını dahi XSD ile tanımlayabiliriz.
XSD ile bir XML dokümanı için hangi kararları verebiliriz?
- Dokümanda hangi elementlerin bulunacağını.
- Elementlerin hangi özniteliklere (attribute) sahip olacağını.
- Bir elementin hangi çocuk elementleri içereceğini.
- Çocuk elementlerin hangi sırada olacağını.
- Elementlerin kaç kez kullanılabileceğini (sayı kısıtlamaları).
- Hangi elementlerin boş olacağını, hangilerinin sadece metin (text) içereceğini.
- Elementlerin ve özniteliklerin veri tiplerini (örneğin, tam sayı, ondalıklı sayı, metin, tarih).
- Elementler ve öznitelikler için varsayılan (default) ve sabit (fixed) değerler belirleyebiliriz.
Bu detaylı kontrol, özellikle farklı sistemler arasında veri alışverişi yapılırken veya uzun süre geçerliliğini koruması gereken veri formatları oluşturulurken kritik öneme sahiptir.
---XSD Temel Kuralları ve Schema Elementi
XSD dosyaları, XML formatındadır ve genellikle .xsd
uzantısına sahiptir. Her XSD dokümanının kök elementi <schema>
olmak zorundadır. Bu element, şema hakkında önemli bilgiler içeren bazı niteliklere sahiptir:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.webkolog.net/schema"
xmlns="http://www.webkolog.net/schema"
elementFormDefault="qualified">
<!-- Şema tanımlamaları buraya gelir -->
</xs:schema>
<schema>
elementinin önemli nitelikleri:
xmlns:xs="http://www.w3.org/2001/XMLSchema"
: Bu nitelik, şema tanımlarımızın W3C'nin XML Schema standardına (xs:
ön eki ile) uygun olarak yapılacağını belirtir.targetNamespace="http://www.webkolog.net/schema"
: Bu şema içinde tanımlayacağımız elementlerin ve niteliklerin ait olacağı isim alanını (namespace) belirtir. Bu, aynı ada sahip elementlerin farklı şemalardan geldiğinde karışmasını önler.xmlns="http://www.webkolog.net/schema"
: XML belgesinde bu şemayı kullanırken, herhangi bir ön ek (prefix) olmadan doğrudan kullanılabilecek varsayılan isim alanını belirtir.elementFormDefault="qualified"
: XML dokümanındaki tüm yerel elementlerin (yani, kendi isim alanlarına sahip olmayanlar) nitelikleri ile birlikte hedef isim alanıyla nitelendirilmesi gerektiğini belirtir.
SIMPLE ve COMPLEX Elementler
XSD'de elementler iki ana kategoriye ayrılır:
- Basit Elementler (SIMPLE Element): Yalnızca metin içeriği içerebilen elementlerdir. İçlerinde başka element veya nitelik barındıramazlar. Örneğin,
<ad>Ali</ad>
içindeki "Ali" bir basit elementin metin içeriğidir. - Karmaşık Elementler (COMPLEX Element): Basit element olmayan tüm diğer elementlerdir. Bunlar, başka elementler, nitelikler veya hem metin hem de element içeriği barındırabilirler. Örneğin,
<insan>
elementi içinde<ad>
,<soyad>
gibi alt elementleri veyatc
gibi nitelikleri barındırabilir.
Element ve Nitelik (Attribute) Tanımlamaları
Element Tanımlaması
Elementler genellikle <xs:element name="[ElementAdi]" type="[ElementTipi]" />
syntax'ı ile tanımlanır. XSD, birçok yerleşik veri tipini destekler:
xs:boolean
: Mantıksal değer (true/false)xs:date
: Tarihxs:decimal
: Ondalıklı sayıxs:integer
: Tam sayıxs:string
: Metin dizesixs:time
: Saat
Ayrıca, elementler için varsayılan veya sabit değerler belirleyebiliriz:
default="default değeri"
: Eğer elementin içeriği belirtilmezse, bu varsayılan değer atanır.fixed="value"
: Elementin içeriği her zaman bu sabit değeri taşımalıdır.
Nitelik (Attribute) Tanımlaması
Nitelikler, <xs:attribute name="[attrAdi]" type="[VeriTipi]" />
syntax'ı ile tanımlanır. Elementlerde olduğu gibi, nitelikler de yerleşik veri tiplerini kullanabilir.
Niteliklerin kullanım zorunluluğunu belirlemek için:
use="optional"
: Nitelik isteğe bağlıdır (varsayılan değer).use="required"
: Nitelik zorunludur. XML dokümanında mutlaka bulunmalıdır.default="default değeri"
: Nitelik belirtilmezse bu varsayılan değer atanır.fixed="value"
: Niteliğin değeri her zaman bu sabit değeri taşımalıdır.
Yeni Tip Oluşturma ve Sınırlandırmalar
XSD'nin en güçlü yanlarından biri, kendi özel veri tiplerimizi oluşturabilme yeteneğidir. Bunu <xs:simpleType>
veya <xs:complexType>
kullanarak yaparız.
Basit Tipler Oluşturma (SimpleType)
Örneğin, 0 ile 100 arasında bir sayı değeri alan bir tip tanımlayalım:
<xs:simpleType name="YuzlukNotTipi">
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="100"/>
</xs:restriction>
</xs:simpleType>
Bu tipi bir elementte kullanmak için:
<xs:element name="sinavNotu" type="YuzlukNotTipi"/>
DataType için Kullanılan Sınırlandırmalar (Facets)
Kendi tiplerimizi oluştururken veya yerleşik tipleri kullanırken çeşitli sınırlandırmalar (facets) uygulayabiliriz:
enumeration
: Bir element veya niteliğin alabileceği belirli değerlerin listesini tanımlar. Örnek:<xs:simpleType name="MevsimTipi"> <xs:restriction base="xs:string"> <xs:enumeration value="Yaz"/> <xs:enumeration value="Kış"/> <xs:enumeration value="ilkBahar"/> <xs:enumeration value="sonBahar"/> </xs:restriction> </xs:simpleType>
pattern
: Metin değerlerinin belirli bir düzenli ifadeye (regex) uymasını sağlar. Örnek (tek harf):<xs:simpleType name="TekHarfTipi"> <xs:restriction base="xs:string"> <xs:pattern value="[a-z]"/> </xs:restriction> </xs:simpleType>
length
,minLength
,maxLength
: Dizeler veya listeler için uzunluk kısıtlamaları.minExclusive
,maxExclusive
,minInclusive
,maxInclusive
: Sayısal değerler için alt ve üst sınırlar.totalDigits
,fractionDigits
: Sayısal tipler için basamak kısıtlamaları.whiteSpace
: Boşluk karakterlerinin nasıl işleneceğini belirler (preserve
,replace
,collapse
). Örnek:<xs:simpleType name="TrimmedString"> <xs:restriction base="xs:string"> <xs:whiteSpace value="replace"/> <!-- Boşlukları tek boşluğa çevir --> </xs:restriction> </xs:simpleType>
Karmaşık Tipler Oluşturma (ComplexType)
Karmaşık tipler, birden fazla alt element veya nitelik içeren elementler için kullanılır. İç içe yapıları tanımlamamızı sağlar. Örneğin:
<xs:complexType name="adrestipi">
<xs:sequence> <!-- Alt elementlerin belirli bir sırayla gelmesini sağlar -->
<xs:element name="sehir" type="xs:string"/>
<xs:element name="cadde" type="xs:string"/>
<xs:element name="mahalle" type="xs:string"/>
</xs:sequence>
</xs:complexType>
Bu adrestipi
'ni başka bir elementte kullanabiliriz:
<xs:element name="evAdresi" type="tns:adrestipi"/> <!-- tns: isim alanını belirtir -->
---
Tekrar Sayısı: minOccurs ve maxOccurs
Bir elementin XML dokümanında kaç kez görünebileceğini minOccurs
ve maxOccurs
nitelikleri ile belirleriz. Varsayılan değerleri 1
'dir.
minOccurs
: Bir elementin en az kaç kez kullanılması gerektiğini belirtir (0 veya daha büyük bir sayı).maxOccurs
: Bir elementin en fazla kaç kez kullanılabileceğini belirtir (bir sayı veyaunbounded
).unbounded
, elementin sınırsız sayıda tekrar edebileceği anlamına gelir.
<xs:element name="name" type="xs:string" maxOccurs="10" minOccurs="0"/>
Bu, <name>
elementinin hiç kullanılmayabileceğini (minOccurs="0"
) ve en fazla 10 kez kullanılabileceğini (maxOccurs="10"
) ifade eder.
XSD Uygulama Örnekleri
Örnek 1: Öğrenci ve Ders Bilgileri Şeması
Bu örnek, öğrencilerin adres ve ders bilgilerini içeren bir XML yapısı için XSD tanımlar. Farklı karmaşık tipleri (adrestipi
, derstipi
, derslertipi
, ogrencitipi
, ogrencilertipi
) bir araya getirerek daha büyük bir yapı oluşturuldu:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.webkolog.net"
xmlns:tns="http://www.webkolog.net"
elementFormDefault="unqualified">
<xs:complexType name="adrestipi">
<xs:sequence>
<xs:element name="sehir" type="xs:string"/>
<xs:element name="cadde" type="xs:string"/>
<xs:element name="mahalle" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="derstipi">
<xs:sequence>
<xs:element name="kod" type="xs:int"/>
<xs:element name="Adı" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="derslertipi">
<xs:sequence>
<xs:element name="ders" type="tns:derstipi" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="ogrencitipi">
<xs:sequence>
<xs:element name="isim" type="xs:string"/>
<xs:element name="soyad" type="xs:string"/>
<xs:element name="adres" type="tns:adrestipi"/>
<xs:element name="dersler" type="tns:derslertipi"/>
</xs:sequence>
<xs:attribute name="no" type="xs:int"/>
</xs:complexType>
<xs:complexType name="ogrencilertipi">
<xs:sequence>
<xs:element name="ogrenci" type="tns:ogrencitipi" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:element name="ogrenciler" type="tns:ogrencilertipi"/>
</xs:schema>
Örnek 2: XML Dosyasını XSD'ye Bağlama
Bir XML dosyasının hangi XSD şemasına göre doğrulanacağını belirtmek için XML dosyasının içinde schemaLocation
niteliğini kullanırız:
XSD Dosyası (note.xsd
):
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">
<!-- Not şeması tanımlamaları buraya gelir -->
<xs:element name="note">
<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string"/>
<xs:element name="from" type="xs:string"/>
<xs:element name="heading" type="xs:string"/>
<xs:element name="body" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
XML Dosyası:
<?xml version="1.0"?>
<note xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3schools.com note.xsd">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
Burada xsi:schemaLocation="http://www.w3schools.com note.xsd"
niteliği, http://www.w3schools.com
isim alanına ait elementlerin note.xsd
dosyasındaki kurallara göre doğrulanması gerektiğini belirtir.
Neden XSD Kullanmalıyız?
XSD, DTD'ye göre birçok avantaj sunar:
- Daha Güçlü Veri Tipleri: XSD, XML'in kendi veri tipleri (string, integer, date vb.) ile daha detaylı veri tipi doğrulaması sağlar.
- İsim Alanları (Namespaces): İsim alanlarını daha iyi destekler, bu da farklı XML şemalarını bir arada kullanırken ad çakışmalarını önler.
- Esneklik ve Genişletilebilirlik: XSD'nin kendisi de XML olduğu için, XML araçlarıyla kolayca işlenebilir ve programatik olarak oluşturulabilir/değiştirilebilir.
- Daha İfade Gücü Yüksek: Elementlerin sıralanışı, tekrar sayısı, koşullu elementler gibi konularda DTD'den çok daha fazla esneklik sunar.
Umarım bu makale, XSD'nin ne olduğu, nasıl kullanıldığı ve XML verilerinizi neden XSD ile doğrulamanız gerektiği hakkında kapsamlı bir bakış açısı sunmuştur. Verilerinizin tutarlılığını ve doğruluğunu sağlamak, sağlam uygulamalar geliştirmenin temelidir!
Webkolog'u takipte kalın!
Hepinize bol kodlu ve başarılı projeler dilerim!
0 yorum:
Yorum Gönder