22 Ocak 2014 Çarşamba

HTML ile Document Type Definition

Merhaba Webkolog takipçileri!

Bugün sizlerle web dünyasının biraz daha derinlerine inerek, özellikle XML ile yakından ilişkili olan ama HTML için de geçmişte büyük önemi olan bir konuya, Document Type Definition (DTD)'a odaklanacağız. DTD, bir XML (veya eski HTML) dosyasının etiket yapısının nasıl olması gerektiğini gösteren ve bu kuralları zorunlu kılan bir şemadır. Yani, verinizin ya da sayfanızın hangi elementleri içerebileceğini, bu elementlerin nasıl iç içe geçeceğini ve hangi niteliklere sahip olabileceğini tanımlayan bir kılavuz gibidir.

---

DTD Nedir ve Neden Önemlidir?

DTD, aslında bir dokümanın "tipini" tanımlar. Bir XML dokümanının veya eski bir HTML dokümanının belirli bir yapıya uygun olup olmadığını kontrol etmek için kullanılır. Bu sayede, farklı uygulamaların aynı yapıyı anladığından ve işlediğinden emin olabilirsiniz. Temel olarak, DTD'ler aşağıdaki kavramları tanımlar:

  • Elementler (Elements): Dokümanda kullanılabilecek etiketler (örneğin, <insan>, <ad>).
  • Nitelikler (Attributes): Elementlere eklenen özellikler (örneğin, <insan tc_kimlik="12345678901">).
  • Varlıklar (Entities): Tekrar eden metin parçalarını veya özel karakterleri temsil eden kısaltmalar (örneğin, &mail;).
  • PCDATA (Parsed Character Data): Ayrıştırıcı tarafından işlenen karakter verisi, yani normal metin içeriği.
  • CDATA (Character Data): Ayrıştırıcı tarafından işlenmeyen karakter verisi, yani içerisindeki etiketlerin metin olarak kabul edildiği bloklar.
---

DTD Kullanım Şekilleri: Dahili ve Harici

DTD'ler iki farklı şekilde bir dokümana dahil edilebilir:

  1. Dahili DTD (Internal DTD): DTD kuralları, XML (veya HTML) dosyasının hemen içinde tanımlanır. Bu yöntem, genellikle küçük ve tekil XML dokümanları için uygundur.
  2. 
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE insanlar [
    	<!ELEMENT insanlar (insan*)>
    	<!ELEMENT insan (ad, soyad, yas)>
    	<!ELEMENT ad (#PCDATA)>
    	<!ELEMENT soyad (#PCDATA)>
    	<!ELEMENT yas (#PCDATA)>
    	<!ATTLIST insan tc_kimlik CDATA #REQUIRED>
    ]>
    <insanlar>
    	<insan tc_kimlik="12345678901">
    		<ad>Ali</ad>
    		<soyad>Mantar</soyad>
    		<yas>30</yas>
    	</insan>
    </insanlar>
        
  3. Harici DTD (External DTD): DTD kuralları ayrı bir .dtd uzantılı dosyada tanımlanır ve XML dosyası bu harici dosyaya referans verir. Bu yaklaşım, birden fazla XML dokümanının aynı DTD'yi kullanması gerektiğinde veya DTD'nin karmaşık olduğu durumlarda daha kullanışlıdır.
  4. XML Dosyası:

    
    <!DOCTYPE insanlar SYSTEM "dosya.dtd">
    <?xml version="1.0" encoding="UTF-8"?>
    <insanlar>
    	<insan tc_kimlik="12345678901">
    		<ad>Ali</ad>
    		<soyad>Mantar</soyad>
    		<yas>30</yas>
    	</insan>
    </insanlar>
        

    DTD Dosyası (dosya.dtd):

    
    <!ELEMENT insanlar (insan*)>
    <!ELEMENT insan (ad, soyad, yas)>
    <!ELEMENT ad (#PCDATA)>
    <!ELEMENT soyad (#PCDATA)>
    <!ELEMENT yas (#PCDATA)>
    <!ATTLIST insan tc_kimlik CDATA #REQUIRED>
        
---

DTD Mantığı: Element ve Nitelik Tanımlamaları

DTD'nin temelini element ve nitelik tanımlamaları oluşturur:

Element Tanımlama

Elementler, <!ELEMENT element_ismi kategori> syntax'ı ile tanımlanır. Kategori, elementin ne tür içerik alabileceğini belirtir:

  • #PCDATA: Elementin yalnızca metin içeriği alabileceğini belirtir. Örneğin, <!ELEMENT ad (#PCDATA)>.
  • EMPTY: Elementin hiçbir içerik almadığını, yani boş olduğunu belirtir (<bilgi/> gibi). Örneğin, <!ELEMENT bilgi EMPTY>.
  • ANY: Elementin herhangi bir içerik (metin veya başka elementler) alabileceğini belirtir. Örneğin, <!ELEMENT dogum_tarihi ANY>.
  • Diğer Alt Elementler: Parantez içinde virgül veya dikey çizgi ile ayrılmış element listeleri, belirli bir sırayı veya seçenekleri ifade eder.

Kullanabileceğiniz bazı ifadeler:

  • (element_adı): Tam olarak o elementi içerir.
  • (element_adı?): Elementin isteğe bağlı olduğunu (0 veya 1 kez) gösterir.
  • (element_adı*): Elementin sıfır veya daha fazla kez tekrarlanabileceğini gösterir.
  • (element_adı+): Elementin bir veya daha fazla kez tekrarlanabileceğini gösterir.
  • (Element1, Element2): Belirtilen elementlerin belirli bir sırayla gelmesi gerektiğini belirtir.
  • (Element1 | Element2): Belirtilen elementlerden sadece birinin olabileceğini gösterir.

Örnekler:


<!ELEMENT insan (isim, soyad, mail+, cep_tel?, adres*, (sehir|ulke))>

Bu tanım şu anlama gelir:

  • Bir <insan> elementi, sırasıyla bir <isim> ve bir <soyad> elementi içermelidir.
  • Ardından en az bir <mail> elementi gelmelidir.
  • <cep_tel> elementi isteğe bağlıdır (0 veya 1 tane).
  • <adres> elementi sıfır veya daha fazla kez tekrarlanabilir.
  • Son olarak, ya bir <sehir> ya da bir <ulke> elementi olmalıdır (ikisi birden değil).

İçeriğinde hem metin hem de element barındırabilen bir yapı için:


<!ELEMENT insan (#PCDATA|isim)*>

Bu, <insan> elementinin içinde hem düz metin hem de <isim> elementlerinin istenildiği kadar tekrar edebileceği anlamına gelir. Örneğin:


<insan>
	Bu bir insan.
	<isim>Ali</isim>
	Takma adı olabilir.
	<isim>Webkolog</isim>
</insan>
Nitelik Tanımlama

Nitelikler, <!ATTLIST element_ismi attribute_ismi tip deger_tipi* varsayılan_deger*> syntax'ı ile tanımlanır. Tip olarak genellikle CDATA (karakter verisi) kullanılır.

Kısıtlamalar (Constraints) ile niteliğin davranışını belirleyebilirsiniz:

  • #REQUIRED: Nitelik zorunludur, boş bırakılamaz.
  • #IMPLIED: Nitelik isteğe bağlıdır, olabilir de olmayabilir de.
  • #FIXED "value": Niteliğin sabit bir değeri vardır ve değiştirilemez.
  • "value": Niteliğin varsayılan (default) değerini belirler.

Örnekler:


<!ATTLIST insan tc_kimlik CDATA #REQUIRED>  <!-- tc_kimlik niteliği zorunlu -->
<!ATTLIST insan puan CDATA #IMPLIED>      <!-- puan niteliği isteğe bağlı -->
<!ATTLIST insan tur CDATA #FIXED "1">     <!-- tur niteliği her zaman "1" olmak zorunda -->
Varlık (Entity) Tanımlama

Varlıklar, tekrar eden metin parçalarını veya özel karakterleri tanımlamak için kullanılır. <!ENTITY isim deger> syntax'ı ile tanımlanır ve kullanımında &isim; şeklinde çağrılır.


<!ENTITY mail "[email protected]">
<insan>
	<ad>Ali</ad>
	<email>&mail;</email>
</insan>
---

HTML ve DTD İlişkisi

Peki, HTML ile DTD'nin ne alakası var? Aslında, HTML'in kendisi de bir DTD kullanılarak tanımlanmıştır! Bir HTML dosyasının başında gördüğünüz <!DOCTYPE html> bildirimi, tarayıcıya HTML5 DTD'sini kullanarak sayfayı yorumlaması gerektiğini söyler. Eski HTML versiyonlarında (HTML 4.01, XHTML 1.0 gibi), daha uzun ve spesifik DTD bildirimleri vardı. Bu bildirimler, tarayıcıların sayfayı hangi kurallara göre işlemesi gerektiğini anlamasını sağlardı (örneğin, "quirks mode" veya "standards mode").

Modern HTML5 ile birlikte, <!DOCTYPE html> basit bir bildirime dönüştü ve tarayıcıların her zaman "standards mode"da çalışmasını sağlamak için bir tetikleyici görevi görüyor. XML tarafında ise DTD'ler, verinin tutarlı ve doğru bir yapıda olduğundan emin olmak için hala önemli bir rol oynamaya devam ediyor, özellikle eski sistemlerle entegrasyonlarda ve belirli veri değişim standartlarında.

Umarım DTD'nin ne olduğu, nasıl kullanıldığı ve web dünyasındaki yeri hakkında aklınızdaki sorulara yanıt bulmuşsunuzdur. Verinin yapısını tanımlamanın ve standartlaştırmanın ne kadar önemli olduğunu bu yazıyla bir kez daha görmüş olduk.

Webkolog'u takipte kalın!

Hepinize bol kodlu ve başarılı projeler dilerim!

0 yorum:

Yorum Gönder