XML:

  1. XML nedir?

    XML acilim olarak extensible markup language demektir. Yani genisletilebilir isaretleme dili. Genel olarak internet uzerinde pekcok isaretleme dili (html, sgml, vrml...) kullanilabilmektedir. Butun bu dillerin toplandigi ve gelistiricinin kendi komutlarini kendisinin yazabilecegi bir dil olan XML cok basit bir iki kural disinda kural icermemektedir. Genel olarak bilginin daha duzgun bir yapiyla tutulmasini saglayan XML tek basina kullanilamamaktadir. Bir parsera ihtiyac duymaktadir.

  2. Bir XML ornegi:

<?xml version="1.0"?>


<!-- File Name: Inventory.xml -->


<INVENTORY>

<BOOK>

<TITLE>The Adventures of Huckleberry Finn</TITLE>

<AUTHOR>Mark Twain</AUTHOR>

<BINDING>mass market paperback</BINDING>

<PAGES>298</PAGES>

<PRICE>$5.49</PRICE>

</BOOK>

<BOOK>

<TITLE>Leaves of Grass</TITLE>

<AUTHOR>Walt Whitman</AUTHOR>

<BINDING>hardcover</BINDING>

<PAGES>462</PAGES>

<PRICE>$7.75</PRICE>

</BOOK>

<BOOK>

<TITLE>The Legend of Sleepy Hollow</TITLE>

<AUTHOR>Washington Irving</AUTHOR>

<BINDING>mass market paperback</BINDING>

<PAGES>98</PAGES>

<PRICE>$2.95</PRICE>

</BOOK>

<BOOK>

<TITLE>The Marble Faun</TITLE>

<AUTHOR>Nathaniel Hawthorne</AUTHOR>

<BINDING>trade paperback</BINDING>

<PAGES>473</PAGES>

<PRICE>$10.95</PRICE>

</BOOK>

<BOOK>

<TITLE>Moby-Dick</TITLE>

<AUTHOR>Herman Melville</AUTHOR>

<BINDING>hardcover</BINDING>

<PAGES>724</PAGES>

<PRICE>$9.95</PRICE>

</BOOK>

<BOOK>

<TITLE>The Portrait of a Lady</TITLE>

<AUTHOR>Henry James</AUTHOR>

<BINDING>mass market paperback</BINDING>

<PAGES>256</PAGES>

<PRICE>$4.95</PRICE>

</BOOK>

<BOOK>

<TITLE>The Scarlet Letter</TITLE>

<AUTHOR>Nathaniel Hawthorne</AUTHOR>

<BINDING>trade paperback</BINDING>

<PAGES>253</PAGES>

<PRICE>$4.25</PRICE>

</BOOK>

<BOOK>

<TITLE>The Turn of the Screw</TITLE>

<AUTHOR>Henry James</AUTHOR>

<BINDING>trade paperback</BINDING>

<PAGES>384</PAGES>

<PRICE>$3.35</PRICE>

</BOOK>

</INVENTORY>


Yukaridaki ornekte goruldugu gibi XML dokumanlarina <?xml version=”1.0”?> satiri ile baslanir. Bu satirdaki version kismi XML dokumanimizin hangi versiyona uyumlu oldugunu gosterir.

<!-- ... --> satiri ise htmlde oldugu gibi comment satiridir, bu isaretler icinde yazilanlar xml dili icin onemsizdir.

Ornekte diger goze carpan ozellikler:


  1. XML orneginin goruntulenmesi

Bir XML dosyasini goruntulemek icin bir XML parser'ina ihtiyac vardir. Ornegin Netscape bu parser'i icerir. Sayet xml dokumanini netscape ile acarsaniz:




Seklinde bir goruntu ile sadece komutlarin arasindaki bilgilerin basildigini gorursunuz.

Peki bu kadar emek vererek hazirladigimiz XML dosyasini daha guzel nasil gorebiliriz?

Bunun icin bir sekil dosyasi olusturmak gerekir.


/* File Name: Inventory01.css */


BOOK

{display:block;

margin-top:12pt;

font-size:10pt}


TITLE

{font-style:italic}


AUTHOR

{font-weight:bold}



Bu dosyaya bakildigi zaman /* ... */ kismi xml deki <!-- ... --> gibi comment kismidir, istedigimizi yazabiliriz.

Peki bu dosya ne anlatiyor?

Margin-top:12pt demektir ki her book ogesinin uzerinde 12 puntoluk bosluk birakilacak

display-block demektir ki her book ogesi bir blok olarak gosterilecek demektir

font-size:10pt demektirki yazilar 10ar punto ile goruntulenecek

fon-style:italic demektir ki her title ogesi yana yatik yazilacak

font-weight:bold demektir ki her author ogesi kalin yazilacak


peki bu css dosyasini bizim xml dosyasi ile nasil birlestirecegiz?

<?xml-stylesheet type=”text/css” href=”Inventory01.css”?> satirini bizim xml dosyasina eklersek olay tamam.



Yukarida goruldugu sekilde formatli bir goruntu elde edilebilir.

  1. CDATA

Peki < > & / gibi semboller XML tarafindan kullaniliyorsa biz bunlari kullanan yazilari nasil XML dokumanina koyucagiz?

<bolum>

bir html sayfasi:

<![CDATA[

<html>

<head>

<title>

Deneme & Yanilma

</title>

</head>

<body>

<p> Hos geldiniz</p>

</body>

</html>

]]>

</bolum>

simdi biz gidip guzel gusel <html> <head> gibi komutlari burada kullanabiliyoruz, oysaki cdata demeseydik bunlar birer xml komutu olarak algilanacakti.

  1. DTD

Data Tag Definition(bazi kaynaklarda Document Type Definition diye de geciyor).Simdiye kadar XML dosyalarinin birer database olarak kullanilabildigini gorduk. Hatta bu bilgilerin formatli bir sekilde nasil gosterilecegini de gormus bulunmaktayiz. Basit bir database'in en temel ozelliklerinden birisi de bilgi girisidir. XML file'ina eklediginiz her satir, bu database'e yeni bir bilgi girisi demektir. Simdi bu database'e her isteyenin istedigi sekilde bilgi girdigini dusunun. Buyuk bir kaosa sebep olabilecek boyle bir basiboslugu engellemek elimizde. Bunun icin dtd denilen definitionlari kullaniyoruz.

DTD'yi kullanmak demek xml dosyamiza bundan sonra girilecek olan butun bilgilerin tanimlanmasi demektir. Bu yuzden cok dikkatli yazilmasi gereken bir alandir.

Simdi basit bir DTD iceren basit bir XML dosyasina bakalim:


<?xml version=”1.0”?>

<!DOCTYPE SIMPLE

[

<!ELEMENT SIMPLE ANY>

]

>


<SIMPLE> Bu basit bir dtd'li xml ornegidir. </SIMPLE>


Simdi yukarida ne goruyoruz?

  1. DTD, <!DOCTYPE ile baslayan kisim.

  2. Tanimladigimiz dokumanimizin adi Simple (butun xml dosyalarinin birer root komutu olacagini unutmayin)

  3. bu dokumanimizin icinde simple diye bir komut var( eh, ismi simple olursa mecburen olur tabi)

  4. ve bu simple komutumuzun herhangi birseyi kabul edebilecegini soyluyoruz (tabii xml kurallarina uygun olacak)

  5. DTD kismi [] isaretleri arasinda bitiyor sonrada xml olarak simple komutumuzu yaziyoruz.


Peki isleri biraz daha karistiralim:

<?xml version=”1.0”?>


<!DOCTYPE KOLEKSIYON

[

<!ELEMENT KOLEKSIYON(CD)+>

<!ELEMENT CD (#PCDATA)>

<!-- DTD ICINE YORUM YAZIYORUZ-->

]

>


<KOLEKSIYON>

<CD>OF AMAN NALAN</CD>

<CD>Muazzez abacidan secmeler</CD>

<CD>Mozrt Violin Concertos 1. 2. and 3. </CD>

</KOLEKSIYON>


Simdi yukaridaki ornekte DTD'nin icinde bir kok elemanimiz var (ki bu dokuman ismiyle ayni). Sonra bu elemanin alt elemani olan bir CD elemanimiz var. (alt elemani oldugunu KOLEKSIYON(CD)'daki CD kismindan anliyoruz)

Ve DTD'nin icine xml'de oldugu gibi yorum yazmak mumkun.

  1. Hazir baslamisken biraz daha DTD

Yukarida da belirttigim gibi DTD oldukca onemli o yuzden detaylarina girmek istiyorum.


<!DOCTYPE INSAN

[

<!ELEMENT INSAN(ISIM,SOYISIM,MEMLEKET)>

<!ELEMENT ISIM(#PCDATA)>

<!ELEMENT SOYISIM(#PCDATA)>

<!ELEMENT MEMLEKET(#PCDATA)>

]

>


Yukaridaki DTD'de ayirac olarak , kullanilmistir. Bu bize siralamanin onemli oldugunu gosterir. Mesela asagidaki xml dokumani kurallara uygun bir dokumandir.


<INSAN>

<ISIM>ALI</ISIM>

<SOYISIM>VELI</SOYISIM>

<MEMLEKET>GIRESUN</SOYISIM>

</INSAN>


Ama siralamayi degistirip asagidaki sekilde yazarsaniz gecersiz bir XML dosyasi olusturmus olursunuz.


<INSAN>

<SOYISIM>VELI</SOYISIM>

<ISIM>ALI</ISIM>

<MEMLEKET>GIRESUN</SOYISIM>

</INSAN>


Peki XML dokumanimizda siralama disinda ne yapabiliriz? Mesela 'veya' mantik operatorunu kullanabiliriz:


<!DOCTYPE INSAN

[

<!ELEMENT INSAN(POSTACI | MUHENDIS | HEMSIRE)>

<!ELEMENT POSTACI(#PCDATA)>

<!ELEMENT MUHENDIS(#PCDATA)>

<!ELEMENT HEMSIRE(#PCDATA)>

]

>


seklinde pipe '|' isareti kullanirsaniz, mantiksal olarak 'veya' demek olabilir ve bu komutlardan sadece birisini kullanabilirsiniz. Ve bu komutlar disinda bir komutta kullanamazsiniz. Mesela asagidaki dokuman kabul edilebilir bir dokumandir.


<INSAN>

<POSTACI>ALI</POSTACI>

</INSAN>


veya


<INSAN>

<MUHENDIS>ALI</HEMSIRE>

</INSAN>


ama asagidaki dokuman birden fazla komutu ayni anda icerdigi icin gecersiz kabul edilir.


<INSAN>

<MUHENDIS>ALI</HEMSIRE>

<POSTACI>ALI</POSTACI>

</INSAN>


?, +, * sembollerinin kullanimi:

automata theorydeki regular expressionlardan esinlenen bu semboller kisaca:

? : sifir yada bir

+: bi yada daha cok

*: sifir yada daha cok

demektir.


#PCDATA ne demek?

Yanlizca karakter seklindeki bilgileri icerir demektir. (bosta olabilir ama teknik hata olur).




  1. DTD ile oyunlar

DTD kullanarak gercekten cok fazla sey yapmak mumkun, simdi dtd kullanarak xml dokumanimizla nasil oynayabilecegimizi gorecegiz.

Ilk sorun su: Cok iyi dusunup uzun emeklerden sonra bir dtd yaziyoruz, peki bunu diger dokumanlar icinde teker yazmak yerine kolay bir yol yok mu? Yada her dtd'de degisiklik yaptigimizida oturup butun xml dosyalarindaki dtdlerimizi yeniden mi yazacagiz?

Tabiki hayir, xml dunyasinda bununda bir cozumu var. Bunun icin dis kaynakli bir dtd yazabiliriz. Soyleki:


<!ELEMENT SIMPLE ANY>


Satirini simple.dtd diye bir dosyaya yazalim.

Simdi, xml dosyamizdan bu dtd dosyasini inlude edecegiz. Bunun icin asagidaki sekilde bir xml dosyasi yazilabilir:


<?xml version=”1.0”?>


<!DOCTYPE SIMPLE SYSTEM “simple.dtd”>

<!-- yada http://www.shedai.net/xml/simple.dtd seklinde url yazmakta mumkun-->

<SIMPLE>basit bir xml dosyasi</SIMPLE>


Boylelikle dtd kismini baska bir dosyaya atmak mumkun olabilir. Simdi simple.dtd'yi birden fazla xml dosyasindan cagirabiliriz. Simple.dtd dosyasinda yaptigimiz her degisiklik bu dosyayi kullanan xml dosyalarinida etkiler.


<?xml version=”1.0”?>


<!DOCTYPE SIMPLE SYSTEM “simple.dtd”>

[

<!ELEMENT BASIT (#PCDATA)>

]

>

<!-- yada http://www.shedai.net/xml/simple.dtd seklinde url yazmakta mumkun-->

<SIMPLE>basit bir xml dosyasi</SIMPLE>


Yukaridaki sekilde doctype komutunun icine hem harici hemde dahili dtd yazilmasi durumunda ikiside calisir. Ancak harici olan dtd oncelige sahiptir. Dolayisiyla BASIT yerine SIMPLE harici dtd'de bulunmus olsaydi, ANY degil #PCDATA ozelliklerine uymak zorunda kalirdi.

DTD icindeki alanlari silmek yerine <![IGNORE[ ... ]]> isratleri icine alarak devre disi birakabilirsiniz. (yorum satirlari haline getirmek gibi).

Ignore edilmis bir alani yeniden aktif hale getirmek icinde ignore yazisini ve ]] isaretlerini silmek yerine kisaca ignore yazisini INCLUDE diye degistirirseniz sorun cozulur.