Geçen yazımızda XML belgemize DTD ekleme konusunda bilgi verip nasıl eleman ve nitelik tanımlayacağımızı anlatmıştık. Kaldığımız yerden devam ediyoruz.

Varlık (Entity) Bildirimleri: Varlık bildirimleri XML belgemizde kullanacağımız değişik tür ve biçimlerdeki verilerimizi XML belgemize aktarmamızın bir yoludur. Örneğin sıklıkla kullandığımız bir metin bloğunu varlık olarak tanımlayarak istediğimiz yerde bu metni kolayca ekleyebilir ve bu metin üzerindeki değişiklikleri varlık bildiriminden yapabiliriz. Bunun yanı sıra XML belgemizin dışındaki harici bir dosyayı varlık olarak tanımlayarak içindeki veriyi XML belgemizde kullanabiliriz. Bu veri metin olmak zorunda değildir.

XML belgemiz içinde tanımladığımız varlık için bir veri pratikte metin olmak zorundadır. Ama varlık olarak tanımlayacağımız harici bir dosyanın içeriği herhangi türden bir veri olabilmektedir. XML belgemizin içinde tanımlayacağımız bir varlık için söz dizimi aşağıdaki gibidir.

<!ENTITY varlık_adı “varlık_degeri”>


Harici bir dosyadan alınacak bir varlık için söz dizimi ise aşağıdaki gibidir.

<!ENTITY varlık_adı SYSTEM “URI/URL”>


(Not: URL = Uniform Resource Locator / URI = Uniform Resource Identifier )

Geçen yazımızı da gözönüne alacak olursak bir döküman tipi tanımlamasında bulunan işaretleme bildirimlerini yüzeysel olarak tanımlamış durumdayız. Şimdi biraz daha ayrıntıya girelim.

1- Eleman Bildirimleri :

Bir önceki yazımızda kısaca değindiğimiz eleman bildirimlerine bu başlığımızda daha geniş bir şekilde yer vermeye çalışacağız.

Bir eleman bildirimi aşağıdaki söz dizimine sahiptir.

<!ELEMENT eleman_adi Kategorisi>


Buradaki eleman_adi XML belgemizde kullanacağımız elemanın adıdır. Alabileceği değerler şu kurala uygun olmak zorundadır; ”İsim bir harf ya da alt tire (_) ile başlayıp sıfır ya da daha fazla harf, rakam, nokta(.), tire(-) veya alt tire (_) ile devam etmelidir. Ayrıca xml öneki (Küçük veya Büyük harflerin kombinasyonundan olabilir) ile başlayan eleman adları standartlar için ayrılmıştır. Şart koşulmasa da, ileride problemlerle karşılaşmamak için kullanılmaması uygun olur.”

Elemanlarımızın alabileceği içerik türlerini Kategorisi kısmında belirtmekteyiz. Kategori kısmında içeriği belirlenir.

Eğer bir eleman alt elemanlara sahipse sadece belirtilen alt elemanları içerebilir. Örneğin;

<?xml version=”1.0”?>

<!DOCTYPE YAZAR

[

<!ELEMENT YAZAR (AD, SOYAD)>

<!ELEMENT AD (#PCDATA)>

<!ELEMENT SOYAD (#PCDATA)>

]

>

<YAZAR>

<AD>Aziz </AD>

<SOYAD>DURMAZ</SOYAD>

</YAZAR>

Bu örnekte dikkat edecek olursanız YAZAR elemanı tanımlanırken AD ve SOYAD alt elemanlarını içerir bir şekilde tanımlanıyor. AD ve SOYAD elemanları ise sadece karakter verisine sahip olacak şekilde tanımlanmıştır.

Not: #PCDATA anahtar sözcüğü karakter verisinin tanımıdır.

Kategori bölümü iki temel şekilde bulanabilinir. Bunlardan birisi sıralı, yani içerilen elemanlar belirtilen sırada bulunmak zorundadır. Ya da seçimli, yani belirtilen elemanlardan birisi seçilip yer verilmesi şeklindedir.

Sıralı : Alt elemanların belli bir sıra içinde bulunması gerektiği zamanlarda eleman bildiriminde, kullanılacak alt elemanlar virgülle ayrılmış ve bulunacakları sırayla kategori kısmında belirtilirler. Örneğin;

<!DOCTYPE YAZAR

[

<!ELEMENT YAZAR (AD, SOYAD, TEL)>

<!ELEMENT AD (#PCDATA)>

<!ELEMENT SOYAD (#PCDATA)>

<!ELEMENT TEL (#PCDATA)>

]

>

şeklinde bir DTD belgesine sahip olan bir XML belgesinin aşağıdaki şekilde olması gerekir.

<YAZAR>

<AD>Aziz </AD>

<SOYAD>DURMAZ</SOYAD>

<TEL>0212 212 21 21</TEL>

</YAZAR>

Eğer ki bu satırlardan herhangi birisi bulunmazsa ya da yerlerinin sıralarında bir değişiklik olursa XML belgemiz DTD ‘mize uygun olmaz. Örneğin aşağıdaki YAZAR elemanları yukarıdaki DTD ‘mize göre geçersiz elemanlardır.

<YAZAR><!—Geçersiz Eleman –!>

<AD>Aziz </AD>

<SOYAD>DURMAZ</SOYAD>

</YAZAR>

veya

<YAZAR><!—Geçersiz Eleman –!>

<SOYAD>DURMAZ</SOYAD>

<AD>Aziz</AD>

<TEL>0212 212 21 21</TEL>

</YAZAR>


Bir alt elemanı birden fazla tekrarlamak da geçersizliğe neden olacaktır.

Seçimli : Alt elemanlardan birisinin elemanın içinde bulması için eleman bildiriminde kategori bölümünde alt elemanlar ( | ) işareti aralarına konularak tanımlanırlar. Örneğin;

<!DOCTYPE YAZAR_TEL

[

<!ELEMENT YAZAR_TEL (GSM | EV | IS)>

<!ELEMENT GSM (#PCDATA)>

<!ELEMENT EV (#PCDATA)>

<!ELEMENT IS (#PCDATA)>

]

>

Şeklindeki bir DTD ‘e sahip olan XML belgesi aşağıdaki şekillerde olabilir.

<YAZAR_TEL>

<GSM>0535 555 5555</GSM>

</YAZAR_TEL>

veya

<YAZAR_TEL>

<EV>0212 212 21 21</EV>

</YAZAR_TEL>

veya

<YAZAR_TEL>

<IS>0212 212 12 12</IS>

</YAZAR_TEL>

Ama herhangi bir elamanın tekrarı veya belirtilen iki elemanın bir arada kullanılması durumunda eleman geçersiz olur. Örneğin;

<YAZAR_TEL><!—Geçersiz Eleman –!>

<GSM>0535 555 5555</GSM>

<EV>0212 212 21 21</EV>

</YAZAR_TEL>

veya

<YAZAR_TEL><!—Geçersiz Eleman –!>

<GSM>0535 555 5555</GSM>

<GSM>0535 666 5555</GSM>

</YAZAR_TEL>

Peki Alt elemanlarımızın tekrarı veya kullanılıp kullanılmayacağı belli değilse o zaman bu şartlar altında DTD ‘mize uygun XML belge yazmamız imkansız olurdu. Bu yüzden Eleman sonlarına ( ? + * ) işaretleri eklenerek bu sorunlar ortadan kaldırılmaktadır.

Karakter Açıklama
* Elemandan sıfır veya daha çok bulunabilir
+ Elemandan bir veya daha çok bulunabilir
? Elemandan sıfır veya 1 tane bulunabilir

Yukarıdaki karakterleri kullanarak özel durumlar için DTD ‘ler oluşturabiliriz. Örneğin; YAZAR elemanımızın alt elemanlarından AD iki isimli olan arkadaşlarımıza göre özelleştirelim ayrıca telefon numarasını bilmediğimiz için yazmayacağız fakat öğrenince eklemek istiyoruz.

<!ELEMENT YAZAR (AD+,SOYAD,TEL?)>

Şeklinde bir eleman bildirimi yapmamız yukarıdaki isteklerimiz yerine getirecektir. Aşağıdaki örnek XML verisi yukarıda belirttiğimiz şartlara uygunluk göstermektedir.

<YAZAR>

<AD>Raif</AD>

<AD>Deniz</AD>

<SOYAD>DURMAZ</SOYAD>

</YAZAR>

Daha sonra telefon numarasını öğrendiğimiz zaman telefon numarasını DTD üzerinde herhangi bir değişiklik yapmadan eklememiz geçersiz eleman oluşmasına neden olmayacaktır. Örneğin;

<YAZAR>

<AD>Raif</AD>

<AD>Deniz</AD>

<SOYAD>DURMAZ</SOYAD>

<TEL>0212 212 2121</TEL>

</YAZAR>

Başka bir örnek belirtmemiz gerekirse telefon elemanımızın alt elemanlarından GSM ve Ev ve İş telefonları ile ilgili bir değişiklik yapmamız gerekirse mesela bunlardan birisi gerekli fakat arkadaşımızın iki tane evi var diyelim ona göre bir veya Hiç telefonu yok buna göre bir DTD yazmamız gerekirse;

<!ELEMENT YAZAR_TEL (GSM | EV* | IS)>

Şeklinde bir DTD oluşturduğumuz zaman * işaretinin özelliğinden yararlanarak;

<YAZAR_TEL>

<EV>0212 212 21 21</EV>

<EV>0312 312 21 21</EV>

</YAZAR_TEL>

veya

<YAZAR_TEL>

<GSM>0 535 555 5555</GSM>

</YAZAR_TEL>

veya

<YAZAR_TEL />

Yukarıdaki tüm elemanlar yukarıda belirttiğimiz eleman tanımlamasına uymaktadır. * İşaretinin özelliğinden dolayı YAZAR_TEL elemanı EV alt elemanından boş eleman olabilmektedir.

Tüm seçimli alt elemanları etkileyecek bir karakter kullanmak istiyorsanız. Seçimli alt elemanların parantezini kapattıktan sonra bir karakter kullanabilirisiniz. Örneğin yazar arkadaşlarımızın birden fazla telefonu olabilir ,hem GSM hem Ev telefonu Hem de iş telefonu olabilir, bu telefonlarından da birden fazla olabilir.

<!ELEMENT YAZAR_TEL (GSM | EV | IS)+>

Şeklinde bir DTD kullandığımız zaman yukarıdaki sorunumuza çözüm getirmiş oluruz. Ve aşağıdaki elemanları oluşturabiliriz.


<YAZAR_TEL>

<GSM>0535 555 5555</GSM>

<EV>0212 212 2121</EV>

<EV>0312 312 2121</EV>

<GSM>0536 666 5555</GSM>

</YAZAR_TEL>

veya

<YAZAR_TEL>

<IS>0212 212 1212</IS>

<IS>0312 312 1212</IS>

</YAZAR_TEL>

veya

<YAZAR_TEL>

<GSM>0535 555 5555</GSM>

</YAZAR_TEL>

Peki ya hem seçimli hem de sıralı bir DTD oluşturmamız gerekirse ne yapabiliriz. Böyle bir durumda aşağıdaki örnek DTD ‘deki şekilde davranıp her iki bildirim şeklini birleştirebiliriz.

<!DOCTYPE YAZAR

[

<!ELEMENT YAZAR(AD, SOYAD, (GSM | EV_TEL | IS_TEL) )>

<!ELEMENT AD (#PCDATA)>

<!ELEMENT SOYAD(#PCDATA)>

<!ELEMENT GSM(#PCDATA)>

<!ELEMENT EV_TEL(#PCDATA)>

<!ELEMENT IS_TEL(#PCDATA)>

]

>

BU DTD ‘ye göre aşağıdaki XML verileri geçerlidir.

<YAZAR>

<AD>Aziz</AD>

<SOYAD>DURMAZ</SOYAD>

<GSM>0535 555 5555</GSM>

</YAZAR>

veya

<YAZAR>

<AD>Raif</AD>

<SOYAD>DURMAZ</SOYAD>

<EV_TEL>0535 555 5555</EV_TEL>

</YAZAR>

Bu yazımızda varlık bildirimlerinden kısaca bahsedip, Eleman Bildirimlerini daha geniş bir şekilde anlatmaya çalıştık. Bundan sonraki yazılarımızda DTD hakkında bilgiler vermeye devam edeceğiz.

Favorilerinize Ekleyin.
  • BlinkList
  • del.icio.us
  • Digg
  • Netvouz
  • DZone
  • ThisNext
  • MisterWong
  • Wists
  • blogmarks
  • Furl
  • Netscape
  • NewsVine
  • Reddit
  • Shadows
  • Technorati
  • YahooMyWeb
  • Fark
  • feedmelinks
  • Fleck
  • kick.ie
  • LinkaGoGo
  • Linkter
  • MyShare
  • Spurl
  • Webride