XML DTD - Document Type Definition
XML'de veri ve ağaç yapısı nasıl tanımlarız.
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ğer | Açıklama |
---|---|
değer | varsayılan değer |
değer | Varsayılan değer |
#REQUIRED | Zorunlu değer |
#IMPLIED | Seçenekli değer |
#FIXED | Sabit 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.