DTD’ler bir belgenin yapısını belirlerler. XML’in ilk harfinde geçen genişleyebilir kelimesinin (Extensible - X) anlamını ifade eden yeni yapılar tanımlamamıza imkan verir. Herhangi bir alandaki uygulamalarda kullanılacak yeni işaretleme dillerini (markup languages) DTD’ler ile geliştirebiliriz. Bu amaçla geliştirilmekte şu anda onlarca XML işaretleme dili vardır. Bu diller XML uygulaması (application) veya XML sözlüğü (vocabulary) olarak anılmaktadır. XML sözlükleri bir alandaki bilgi değişimi ortamını sağlamak için tanımlanmış işaretleme dilleridir. Bazı XML sözlükleri örnekleri aşağıda verilmiştir:
• Synchonized Multimedia Integreration Language (SMIL)
• Chemical Markup Language (CML)
• Bioinformatic Sequence Markup Language (BSML)
• Common Business Library (CBL)
Bu yeni diller için tanımlanan DTD’ler bu dilin hangi etiketleri içerbileceği, etiketlerin sahip olabileceği özellikleri, hangi elemanların diğer hangi elemanları içerebileceği gibi dil yapısı bilgilerini (gramer) içerir.
Bilgisayar ortamında dillerin gramer’leri genellikle EBNF (Extended Backus-Naur Form)’da tanımlanır. XML belirtimide (XML Specification) original olarak EBNF notasyonunda belirtilmiştir. XML 1.0 belirtimi http://www.w3.org/TR/REC-xml adresinden elde edilebilir. EBNF dili yapı kurallarını içerir. Her bir yapı kuralının sol tarafı yapının ismini sağ tarafı ise yapıyı tanımlar. Bir kişinin bir isminin şart olmasının gerektiğini ve opsiyonel olarak telefon numaralarının bulunabileceğini EBNF’de şu şekilde ifade edebiliriz.
XML:
Kişi ::= (isim telefon-no*)
Aynı yapı DTD’de şu şekilde tanımlanabilir.
XML:
<!ELEMENT kişi (isim telefon-no*)>
Bir XML belgesinin yapısı DTD’de aşağıda verilan dört çeşit işaretleme ifadesi ile tanımlanır.
DTD ifadesi ------------ Anlamı
ELEMENT ------------- Bir XML elemanı tanımlar.
ATTLIST ------------- Bir eleman tipinin alabileceği özellikleri tanımlar.
ENTITY ------------- Belli bir içeriğin bir isme bağlanarak o isimle ilişkilendirilmesini sağlar.
NOTATION ------------- XML hariçi içeriğin tanımlanmasını sağlar. Bu tanımlaran içerik XML belgesinin bir parçası olarak parse edilmez.
Elemanlar
Elemanlar bir XML belgesinin en temel yapılarıdır ve ELEMENT etiketi ile tanımlanırlar. Dört çeşit eleman tipi vardır:
• Empty (Boş) : Eleman herhangi bir içerik içermez. Elemanın özellikleri olabilir.
• Element Only (Yalnızca Eleman) : Eleman yalnızca alt seviye (child) elemanları içerebilir.
• Mixed (Karışık) : Eleman alt seviye elemanlar ve karakter veri karışımını içerebilir.
• Any : Eleman DTD’in izin verdiği içeriği içerebilir.
Boş (Empty) Elemanlar
Boş elemanlar aşağıdaki formatta tanımlanır.
XML:
<!ELEMENT Elemanİsmi EMPTY>
Örneğin
XML:
<!ELEMENT img EMPTY)>
Boş eleman XML belgesi içerisinde daha önce açıklandığı gibi eğer bir özelliği yoksa
aşağıdaki ilk iki satırdaki gibi geçecektir:
XML:
<img/>
<img></img>
<img src=”resim.gif”/>
<img src=”resim.gif”/><img>
Yukarıdaki örnekte alttaki iki satırda img elemanı src adlı bir özellik içermektedir
Yalnızca Eleman İçeren (Element Only) Elemanlar
Bu tipteki elemanlar aşağıdaki formattadır.
XML:
<!ELEMENT Elemanİsmi İçerik-Modeli>
Bu yapıda İçerik-Modeli yalnızca bu elemanın altında kalacak alt elemanları içerebilir.
Örneğin Şekil 4’te verilen elektronik posta kök elemanı e-posta’nın tanımı aşağıdaki gibidir.
XML:
<!ELEMENT e-posta kime kimden tarih? konu? mesaj>
Bu örnek e-posta elemanı kime, kimden ve mesaj alt elemanlarını mutlaka gösterilen sırada XML belgesi içinde geçmesi gerektiğini göstermektedir. Tarih ve konu elemanları ise opsiyoneldir. Bu elemanların opsiyonal olduğunu (?) sembolü göstermekdedir. XML’de çeşitli amaçlarla kullanılan sembollerin anlamları aşağıda listelenmiştir:
Eleman Tanımı ---------- Anlamı
A? ---------- Opsiyonel; A alt elemanı bir defa veya hiç gözükmeyebilir.
A+ A ---------- alt eleman mutlaka bir defa veya daha fazla gözükür.
A* A ---------- alt eleman sıfır veya daha fazla gözükebilir.
A,B ---------- B elemanı A’dan sonra gözükmelidir.
A | B ---------- A veya B’den bir tanesi gözkebilir.
( ) ---------- Paratez içinde geçecek elemanları guruplar. Örneğin (A,B)+ ifadesi A ve B’nin ardışık olarak bir veya daha fazla geçeceğini götermektedir
Aşağıdaki bu sembolleri kullanan bir özgeçmiş elemanı örneği verilmiştir:
XML:
<!ELEMENT özgeçmiş (giriş, (eğitim | deneyim+)+, hobiler?, referanslar*>
Karışık (Mixed) Elemanlar
Karışık elemanlar hem karakter veri hemde alt elemanları içerebilirler. Karakter veri #PCDATA terimi ile gösterilir ve parsed karakter veri anlamındadır. Aşağıda Karışık eleman örnekleri verilmiştir:
XML:
<!ELEMENT konu (#PCDATA)>
<!ELEMENT not (#PCDATA | tarih | konu)*>
İlk satırdaki ifade konu elemanının yalnızca karakter veri içereçeğini göstermektedir. Bu tip yalnızca veri içeren eleman tanımlarında #PCDATA parantez içine alınmalıdır.
İkinci satırdaki karmaşık not elemanın karakter veri, tarih veya konu elemanlarından oluşabileceğini göstermektedir. Aşağıda buna bir örnek verilmiştir.
XML:
<not>
<tarih> 1 Ekim 2000 </tarih>
Okul kayıtları başlayacak.
</not>
ANY elemanları
ANY tanımının formatı aşağıdaki şekildedir.
XML:
<!ELEMENT Elemanİsmi ANY>
ANY elemanları herhangi bir yapıya sahip değildir. ANY elemanı karakter veri, tanımlanmış elemanlar veya bunların bir karışımını içerebilir. ANY elemanları her hangi bir yapı belirtmediği için kullanılması tavsiye edilmez.
Özellikler (Attributes)
Daha öncede belirtildiği gibi özellikler elemanlar hakında ek bilgi tanımlamak için kullanılır. Bir eleman hakkındaki özellik bilgileri aşağıdaki formatta tanımlanır.
XML:
<!ATTLIST Elemanİsmi Özellikİsmi ÖzellikTipi Default>
Bir özellik bir isim ve tip bilgisini içerir. Default bir değer olabilir veya özellik kullanımı hakkında bilgi verir. Dört çeşit default değer tipi aşağıda verilmiştir.
Default --------- Anlamı
#REQUIRED --------- Özellik her zaman tanımlanmalıdır.
#IMPLIED --------- Özellik opsiyoneldir.
#FIXED Değer --------- Özellik sabit bir Değer’e sahiptir. Özellik eleman içinde tanımlı olmazsa, parser bu sabit değer’in olduğunu varsayar.
Değer --------- Özellik eleman içinde tanımlı olmazsa, parser bu değer’in olduğunu varsayar. Eğer tanımlı ise özellik farklı bir değer içerebilir.
Örneğin aşağıdaki örnekte Kitap elemanının BasımTarihi diye bir özelliğinin olduğu ve bu özelliğin karater veri olduğu (CDATA) belirtilmektedir.
XML:
<!ATTLIST Kitap BasımTarihi CDATA #REQUIRED>
Bu özellik bir XML belgesi içinde şu şekilde geçebilir:
XML:
<Kitap BasımTarihi=”1.1.2000”> ...... </Kitap>
Aşağıdaki örnek kitap Basım-Sayısı özelliğinin opsiyonel olduğunu göstermektedir.
XML:
<!ATTLIST Kitap Basım-Sayısı CDATA #IMPLIED>
Aşağıdaki örnek deniz elemanının renk özelliğin sabit olarak mavi değerine sahip olduğunu göstermektedir.
XML:
<!ATTLIST deniz renk #FIXED “mavi”>
Aşağıdaki örnek elma elemanının renk özelliğinin default olarak kırmızı olduğunu göstermektedir.
XML:
<!ATTLIST elma renk “kırmızı”>
Özellik Tipi ----------------- Anlamı
CDATA ----------------- Karakter veri (Unparsed)
Enumarated ----------------- Özelliğin sahip olabileçeği değerler kümesi
NOTATION ----------------- DTD’de tanımlanmış herhangi bir notation.
ENITITY ----------------- Harici bir varlık.
ENTITIES ----------------- Bir den fazla boşlukla (white space) ayrılmış varlıklar.
ID ----------------- Bir belge içerisinde geçebilecek tek tanımlayıcı bir değer (unique identifier).
IDREF ----------------- DTD’te tanımlanmış olan bir ID’ye olan referans.
IDREFS ----------------- Boşlukla (white space) ayrılmış ID’ler serisine referans.
NMTOKEN ----------------- XML token karaklerlerinden (harf, sayı, nokta, tire, iki nokta, alt cizgi) oluşan bir isim.
NMTOKENS -----------------XML token karakterlerinden oluşan boşlukla ayrılmış bir çok isim.
Enumerated özellikler bir dizi değer kümesi içerir. Özellik bunlardan bir değeri alabilir:
Aşağıdaki örnek kalem elemanının renk özeliğininin mavi, kırmızı, yeşil veya beyaz olabileceğini göstermektedir. Eğer bir renk seçilmezse default olarak kırmızı renk alınır
XML:
<!ATTLIST kalem renk (mavi | kırmızı | yeşil | beyaz) “kırmızı”>
Aşağıdaki örnek DTD’de tanımlanmış olan notation’ları özellik olarak kullanmaktadır.
Notation XML harici veri tiplerini tanımlamakta kullanılır. Bu örnek resim formatının gif veya jpeg olabileceğini belirtmektedir.
XML:
<!ATTLIST resim format NOTATION (gif | jpeg) #REQUIRED>
ID tipindeki özellikler değerleri bir belge içerisinde yalnızça bir defa geçebilir. Bu bize bir elemanı unique olarak tanımlamamızı sağlar. Örnegin personel diye bir elemanımız olsun. Her personel personel-no adlı bir özellik içersin. Her personelin numarası farklı olacağından bu özellik ID olarak tanımlanır.
SQL:
<!ATTLIST personel personel-no ID #REQUIRED>
IDREF, ID tipindeki elemanlara referans vermemizi sağlar. Örneğin mühendis adlı bir elemanımız olsun. Mühendis ile personel arasındaki bire bir ilişkiyi IDREF ile belirtebiliriz.
XML:
<!ELEMENT mühendis EMPTY>
<!ATTLIST mühendis per-no IDREF #REQUIRED>
Bu bize mühendisin personel bilgilerini personel elemanından elde etmemizi sağlar. Aşağıda bir XML belgesi örneği verilmiştir.
XML:
<personel personel-no=”12345”>
<isim> Ali Veli </isim>
.....
</personel>
.....
<mühendis per-no=”12345”/>
IDREFS iki eleman arasındaki bire çoklu ilişkileri göstermekte kullanılabilir.
Örneğin proje-gurubu adlı bir elemanımız olsun. Bir proje gurubu bir çok personel içerecektir. Bu ilişkiyi şu şekilde belirtebiliriz:
XML:
<!ELEMENT proje-gurubu EMPTY>
<!ATTLIST proje-gurubu per-no IDREFS #REQUIRED>
Bu yapıdaki bir XML belgesi aşağıda verilmiştir. Bu belge 12345, 67891, 23456 nolu personelin proje gurubunda yer aldığını belirtmektedir.
XML:
<proje-gurubu per-no=”12345 67891 23456”
Özellik değerlerininin token olarak varsayılması gereken durumlarda NMTOKEN veya NMTOKENS tipini kullanılır. Token boşluk içermeyen bir değerdir. XML parser’ı bir özelliği token olarak işlemesi durumumda aradaki boşlukları (white space) tek boşluğa indirger ve baş ve sondaki boşlukları siler. Bu işlem özellik değeri normalizasyonu (attribute value normalization) olarak adlandırılır. Aşağıda bir çok token içeren bir NMTOKENS özellik tipi tanımı ve XML ifadesi verilmiştir.
XML:
<!ATTLIST personel eğitim NMTOKENS #IMPLIED>
<personel eğitim=”ilkokul ortaokul lise ”