İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır

DTD (Document Type Definition)

DTD nedir?

Bir XML document'inin element'lerinin doğru yazılması için hangi kurallara uyulması gerektiği DTD ile verilir. Örneğin bir element'in için hangi element'lerin olacağı veya bir element'in kaç attribute'si olacağı veye bir element'in içinde yazının olup olamayacağı vs.. gibi kurallar DTD ile verilir.

DOCTYPE declaration

Bir XML document'inin hangi DTD'ye uyacağını vermek için DOCTYPE declaration'u kullanılır. XML'de declarationlar <! ile başlar ve > ile biter. DTD dosyasının uzantısı dtd olmalıdır. Aşağıda workers root elementi olan bir document için workers.dtd kullanılmaktadır.

<!DOCTYPE workers SYSTEM "http://www.godoro.com/dtds/workers.dtd">

burada ilk önce root elementinin adı verilir. SYSTEM ile bu tür XML için özel yapılmış bir DTD dosyası olduğunda kullanılır. Eğer daha önce yapılmış bir DTD kullanılmak isteniyorsa SYSTEM yerine PUBLIC yazılmalıdır.

DTD dört tip data veya content tanımlamak için declaration vardır. ELEMENT, ATTLIST, ENTITY, NOTATION

ELEMENT Declaration

XML document'inde kullanılacak element'leri tanımlamak için kullanılır. Genel kullanım

<!ELEMENT name CATALOG>
veya
<!ELEMENT name (content)>

biçimindedir.

Örneğin içinde hiç bir şey kullanılmayan br elementi aşağıdaki gibi tanımlanır.

<!ELEMENT br EMPTY>

Eğer bir element herhangi bir element içerebilirse EMPTY yerine ANY kullanılır.

Eğer bir element'in içinde sadece yazı olması gerekiyorsa aşağıdaki gibi tanımlanmalıdır.

<!ELEMENT surname (#PCDATA)>	

bu ifade surname element'in içinde yanlızca yazı bulunabilir anlamındadır. İçinde başka bir element bulunamaz. Örneğin worker element'inin içinde name ve surname element'leri bulunuyorsa aşağıdaki gibi tanımlanmalıdır

<!ELEMENT worker (name,surname)>	

burada , ile ayrılmıştır. Bu şu anlama gelir. worker element'inin içinde önce name sonra surname olmalıdır. Burada sırası önemlidir. Eğer biri kullanılırsa diğerinin kullanılmamasını istiyorsanız aşağıdaki gibi tanımlamalısınız.

<!ELEMENT worker (name|surname)>	

burada | işareti veya anlamına gelir. worker element'inin içinde name veya surname olabilir.

Cardinality Operator

Bir element'in içinde bir content'in nasıl uygulanacağını belirlemek için bu operatorler kullanılır. Eğer hiç bir şey yazılmassa (yukarıdaki örneklerdeki gibi) sadece 1 kere kullanılmalıdır ve kullanılması gereklidir anlamına gelir. Eğer ? kullanılırsa ya hiç ya da bir kere kullanılabilir. Örneğin aşağıdaki örnekte middlename worker elementinin içinde hiç kullanılmayabilir veya sadece 1 kere kullanılabilir.

<!ELEMENT worker (name,middlename?,surname)>

Eğer hiç veya istenildiği kadar kullanılabilmesi içinde * operatorü kullanılır. Örneğin aşağıda nick element'i ya hiç kullanılmayabilir veya istenildiği kadar kullanılabilir.

<!ELEMENT worker (name,middlename?,surname,nick*)>

Eğer bir element'in en az bir kere veya daha fazla kullanılmasını istiyorsanız + operatoru kullanılır. Aşağıda song elementi bu şekilde tanımlanmıştır.

<!ELEMENT worker (name,,surname,song+)>

Bu ifadeler karışık olarak kullanılabilir. Aşağıdaki kod buna örnektir.

<!ELEMENT section (head?,(paragraph|code|listing|warning|tip)*) >	

Örnekte head element'i hiç yada bir kere kullanılabilir. Bundan sonra parentezin içindeki element'ler ya hiç ya da istenildiği sayıda kullanılabilirler. Çünkü parentezin sağına * operatoru konulmuştur. | kullanıldığı için de sıra önemli değildir.

ATTLIST Declaration

Element'lerin attribute'lerini vermek için bu declaration kullanılır. Genel kullanımı:

<!ATTLIST elementAdı attributeAdı attributeTipi attributeVarsayılanı varsayılanDeğeri>

Örneğin worker element'inin id ve no diye iki attributesi olması için aşağıdaki gibi bir tanımlama yapmak gereklidir.

<!ATTLIST worker 
	id CDATA #REQUIRED
	no CDATA #IMPLIED	
>

Burada id attribute'si bir yazı alacağını belirtiyoruz. CDATA karekter data anlamına gelmektedir. #REQUIRED ile bu attribute'nin kullanılmasının mecburi olduğunu belirtiyoruz. #IMPLIED ise no attribute'sinin kullanılmasının isteğe bağlı olduğunu bildirir. Eğer bir attribute'nin değerleri belli sayıda olmalı ise bu DTD ile verilebilir. Örneğin smoking attribute'si yes ve no değerlerini alabilirse aşağıdaki gibi declaration yapılabilir.

<!ATTLIST worker 
	smoking (yes|no) #IMPLIED
>

Bir default değer atanmak istenebilir. Örneğin default değeri no yapılabilir. Aşağıda bu örnek görülmektedir.

<!ATTLIST worker 
	smoking (yes|no) "no"
>

Dikkat edilirse default değer verilmişse #IMPLIED veya #REQUIRED tanımlamasına gerek yoktur. Çünkü zaten default bir değeri vardır. Bu iki tanımlamanın gereği yoktur.

ENTITY

Entity'ler bir karektere veya string'e referans olan isimlerdir. Örneğin &lt; < işeretini gösterir. General Entity ve Parameter Entity olarak iki çeşit entity vardır. General Entity'ler XML document'lerinde kullanılırlar. Parameter Entity'ler ise yanlızca DTD document'lerinde kullanılırlar.

General Entity'ler şu şekilde tanımlanırlar

	<!ENTITY name "referans gösterdiği yazı">

ve bu entity bir XML document'tinde &name; şeklinde kullanılır. Parser bu entity ifadesini görünce onun yerine referans gösterdiği yazıyı yerleştirir. Örneğin aşağıda copyrightSentence entity'si tanımlanmış ve kullanılmıştır.

DTD document
<!ENTITY copyrightSentence "&copy; 2002 by GODORO">
XML document
<copyrigth>&copyrightSentence;</copyrigth>

Burada copyrightSentence entity'si tanımlanmıştır. Bu entity &copyrightSentence; şeklinde kullanılınca yerine &copy; 2002 by GODORO ifadesini geçirecektir. Burada &copy; ifadesi de copyright işaretini gösteren bir entity referance'dır. Böylece bu cümleyi her yere yazmak yerine entity referance'sı kullanılabilir.

Paramater entity tanımlamak için ise % işareti kullanılır.

	<!ENTITY % name "referans gösterdiği yazı">

Böylece bir Parameter Entity tanımlanmış olur. Bu entity'yi kullanmak için %name; yazılmalıdır. Aşağıdaki örnekte bu kullanılmaktadır.

	<!ENTITY % inline "i|b|em">
	<!ELEMENT p (%inline;)>

Örnekte inline entity'si yaratılmıştır. Bu entity i|b|em yazısını göstermektedir. p (%inline) ile biz p(i|b|em) demiş olduk. Böylece biz entity'ye yeni bir inline element eklediğimizde bu element p tag'inin içinde kullanılabilir olacaktır.

Diğer bir çeşit entity de External Entity'dir. Bu entity'de entity bir dosyanın içeriğine referans gösterir. Entity kullanıldığı yere bu entity'nin referans gösterdiği dosyanın içeriği gömülür.

DTD document
	<!ENTITY test SYSTEM "http://www.godoro.com/test/test.txt">
XML document
	<worker>
		<name>&test;</name>
	</worker>

Örnekte test adında bir external parameter kullanılmıştır. Kullanıldığı yere test.txt dosyasının içindeki yazılar koyulacaktır.

External Entity'de gösterilen dosya XML Parser'ının değerlendirebileceği bir dosya değilse ne olur. Örneğin bir gif dosyası gösteriliyorsa. Gif dosyası XML için unparsed (parse edilemeyen) bir data'dır. Bunun için Unparsed Entity'ler kullanılır.

DTD document
	<!ENTITY photo SYSTEM "http://www.godoro.com/test/photo.gif" NDATA GIF89a>
XML document
	<worker>
		<photo src="&photo;"></name>
	</worker>

Burada NDATA(Notation Data) bu datanın parse edilebilir bir data olmadığını gösterir. Dikkat edilmesi gereken bir şey de photo element'inin src attribute'sinin tipi Entity olarak verilmelidir.

<!ATTLIST photo
	src ENTITY #REQUIRED
>

şeklinde tanımlanması gerekir. Çünkü src attributesi bir entity'yi referans göstermektedir.

İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır