XML dokümanın tanımlaması diyebiliriz.

Tanımlamadan kastım XML içinde kullanılan elemanların, etiketler, ağaç yapısını vs. neler olacağını belirtiyoruz.

Bu sayede bir standart oluşturmuş ve bunu doğrulamış oluyorsunuz.

XML Yapı Taşları

  • Elemanlar
  • Etiketler
  • Varlıklar
  • PCDATA
  • CDATA

Sırayla bu yapı taşlarının DTD nasıl tanımlarız öğreneceğiz.

Elemanlar

<!ELEMENT eleman-ismi eleman-içeriği>

Genel olarak eleman tanımlama standardı bu şekilde. Boş eleman tanımlamak için;

<!ELEMENT eleman-ismi EMPTY>
Örnek:
<!ELEMENT br EMPTY>
<br />

PCDATA eleman tanımlamak için

<!ELEMENT eleman-ismi (#PCDATA)>
Örnek:
<!ELEMENT adi (#PCDATA)>

Herhangi bir içeriği bulunan bir eleman tanımlamak için ANY kullanırız;

<!ELEMENT eleman-ismi ANY>
Örnek:
<!ELEMENT kitap ANY>

Elemanın altında elemanlar var ise çocuk eleman diyorduk, çocuk elemanı bulunan bir eleman tanımlamak için;

<!ELEMENT eleman-ismi (çocuk1,çocuk2...)>
Örnek:
<!ELEMENT kitap (adi,yazar,dil,baski,tarih)>

Biraz daha genişletelim ve sadece bir elemanı var ise;

<!ELEMENT kitaplar (kitap)>
<!ELEMENT kitap (adi,yazar,dil,baski,tarih)>
<!ELEMENT adi (#PCDATA)>
<!ELEMENT yazar (#PCDATA)>
<!ELEMENT dil(#PCDATA)>
<!ELEMENT baski (#PCDATA)>
<!ELEMENT tarih (yil,ay,gun)>
<!ELEMENT yil (#PCDATA)>
<!ELEMENT ay (#PCDATA)>
<!ELEMENT gun (#PCDATA)>

Eğer elemanın birden çok aynı elemanı bulunuyor ise o çocuk elemanın yanına + ekleyerek aşıyoruz.

<!ELEMENT kitaplar (kitap+)>
<!ELEMENT kitap (adi,yazar,dil,baski,tarih)>
<!ELEMENT adi (#PCDATA)>
<!ELEMENT yazar (#PCDATA)>
<!ELEMENT dil(#PCDATA)>
<!ELEMENT baski (#PCDATA)>
<!ELEMENT tarih (yil,ay,gun)>
<!ELEMENT yil (#PCDATA)>
<!ELEMENT ay (#PCDATA)>
<!ELEMENT gun (#PCDATA)>

Sıfır yada daha fazla eleman için * kullanırız.

<!ELEMENT eleman-ismi (çocuk*)>
Örnek:
<!ELEMENT kitaplar (kitap*)>

Sıfır yada bir tane eleman için ? kullanırız.

<!ELEMENT eleman-ismi (çocuk?)>
Örnek:
<!ELEMENT kitaplar (kitap?)>

İki veya daha fazla çocuk için seçenek sunmak için kısacası "yada" kullanımı için | ekleriz.

<!ELEMENT eleman-ismi (çocuk1|çocuk2)>
Örnek:
<!ELEMENT kitap (baski|isbn)>

Etiketler

<!ATTLIST eleman-ismi etiket-ismi etiket-tipi etiket-değeri>

Etiket standartı yukarıda görmüş olduğunuz gibidir. Örnek:

<!ATTLIST kitap isbn ID "9759954949">
XML:
<kitap isbn="9759954949"></kitap>

Etiket Tipleri

| Tip | Açıklama | | --------- | ------------------------------------ | ------ | ------------------------------------------------ | | CDATA | Karekterlerden oluşan veri | | (secenek1 | secenek2 | sece…) | Değeri girilen seçeneklerden biri olmak zorunda. | | ID | Benzersiz bir değeri olması gerekir | | IDREF | Farklı bir elemanın ID | | IDREFS | Farklı bir ve birden çok elemanın ID | | NMTOKEN | Geçerli bir XML ismi | | NMTOKENS | Geçerli bir listedeki XML ismi | | ENTITY | Varlık | | ENTITIES | Varlıklar | | NOTATION | Notlandırılmış |

Etiket Değerleri

DeğerAçıklama
değervarsayılan değer
değerVarsayılan değer
#REQUIREDZorunlu değer
#IMPLIEDSeçenekli değer
#FIXEDSabit değer

Bütün etiket tiplerini deneyemeceğimiz için bir kaç tanesini göstersek yeterli olur. Zaten ID ile ilgili bir örnek var yukarıda.

Etiket tipi olarak ID değer olarak #REQUIRED bir örnek yapalım.

<!ATTLIST eleman-ismi etiket-ismi ID #REQUIRED>
DTD:
<!ATTLIST kitap isbn ID #REQUIRED>
XML:
<kitap isbn="9759954949"></kitap>

Varlıklar

<!ENTITY varlık-ismi "varlık-değeri">
DTD:
<!ENTITY kitap "Yunus Emre Divanı">
XML:
<kitaplar>&kitap;</kitaplar>

Harici bir varlık çağırmak için;

<!ENTITY varlık-ismi SYSTEM "ADRES">
DTD:
<!ENTITY kitap SYSTEM "https://mehmetcan.sahin.dev/kitap.dtd">
XML:
<kitaplar>&kitap;</kitaplar>

DTD incelememizi bitirdik şimdi örnekle pekiştirelim. Daha önceden kullanmış olduğumuz kütüphane örneğini DTD ekleyelim.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE kitaplar [
<!ELEMENT kitaplar (kitap+)>
<!ELEMENT kitap (adi,yazar,dil,baski,tarih)>
<!ELEMENT adi (#PCDATA)>
<!ELEMENT yazar (#PCDATA)>
<!ELEMENT dil (#PCDATA)>
<!ELEMENT baski (#PCDATA)>
<!ELEMENT tarih (yil,ay,gun)>
<!ELEMENT yil (#PCDATA)>
<!ELEMENT ay (#PCDATA)>
<!ELEMENT gun (#PCDATA)>

<!ATTLIST kitap isbn ID #REQUIRED>
<!ATTLIST yazar gorev CDATA #IMPLIED>
]>
<kitaplar>
    <kitap isbn="9759954949">
        <adi>Yunus Emre Divanı</adi>
        <yazar gorev="Derleyici">Selim Yağmur</yazar>
        <dil>Türkçe</dil>
        <baski>8</baski>
        <tarih>
            <yil>2014</yil>
            <ay>04</ay>
            <gun>01</gun>
        </tarih>
    </kitap>
    <kitap isbn="9753386203">
        <adi>Risaletü'n-Nushiyye Yunus Emre</adi>
        <yazar gorev="Çevirmen">Prof. Dr. Umay Türkeş Günay</yazar>
        <dil>Türkçe</dil>
        <baski>3</baski>
        <tarih>
            <yil>2009</yil>
            <ay>01</ay>
            <gun>01</gun>
        </tarih>
    </kitap>
</kitaplar>

Eğer DTD dosyamızı farklı bir yerde saklamak istersek.

<!DOCTYPE kitaplar SYSTEM "ADRES">

Peki yazdığımız DTD'nin geçerli(valid) olup olmadığını nasıl anlayabiliriz derseniz.

http://www.w3schools.com/xml/xml_validator.asp adresinden kontrol edebilirsiniz.