XML (Extensible Markup Language), veriyi belli bir yapıda tanımlamak için kullanılan bir dildir. Bir verinin belli bir yapıda olması, o veri içerisindeki bilginin gerektiğinde kullanılabilir, değiştirilebilir ve başka biçimlere dönüştürülebilir olmasını sağlar.
Diyelim ki saklamak istediğimiz veri bir sınavının soruları olsun. Sınavı düz metin (plain text) şekilde yazalım :
Matematik Dersi 2. Ara Sınavı Soru 1 : İki kere iki iki kaç eder? a) 22 b) 3 c) 4 d) 5 Soru 2 : Kendimi kendimden çıkarsam kaç kalır? a) 1 b) 2 c) 0 d) FD
Bu metin bir insanın çok rahat okuyabileceği ve anlayabileceği bir biçimde yazılmıştır. Ama bir bilgisayar programı bu metnin içindeki bilgileri okuyamaz. '1. sorunun ikinci şıkkı' gibi bir bilgiyi belge içerisinden nasıl bulunabileceğini düşünelim. En basit yol metni satırlara bölmek ve 4. satırı almak, sonra da ilk boşlıktan sonraki kısmı okumaktır. Peki ya sınav adından sonra bir boşluk eklenirse? Program bu kez yanlış satırı getirecektir. Ya 'b' şıkkında 'b' ile ')' arasına bir boşluk konursa? O zaman sayı yerine bir parantez elde edeceğiz! Görüldüğü gibi düz metin bir programın veri saklaması ve erişmesi için uygun bir biçim değildir.
Geleneksel olarak veri tablolarda tutulur. Bir okuldaki öğrenciler
123 Barış Manço 234 Cem Karaca 542 Edip Akbayram 423 Ersen
Tablo tarzı veriler düz bir dosya'da (flat file'da) saklanabilir. Her kayıt bir satıra konur ve bir kayıtta her alan arasına boşluk, sekme (tab), noktalı virgül (;), virgül(,) gibi ifadeler konur. Olmayan değerler boş geçilir. O zaman bir programın bunları anlaması kolay olur. Düz tabloların gelişmesiye veritabanları doğmuştur. Bir veri tabanında tablolarda hangi alanların olacağı ve bu alanlarda bulunabilecek verinin (metin,tamsayı veya kesirli sayı gibi) tipleri belirenir. Bunlara erişmek için SQL diye bir dil bulunmaktadır. 542 numaralı öğrencinin adını öğrenmek için
select Name form Student
şeklinde bir 'sorgu' (query) yazılır.
Zamanla, tablo yapısının çok kısıtlı olduğu ortaya çıkmıştır. Birbirine eşdeğer maddelerden oluşmayan veriler için tablo yapısı yetmez. Basit bir liste bile tablolarla kolay olarak gösterilemez. Bir şeyin altında başka birşey, onun altında da başka bir şey varsa tablolar gittikçe karmaşıklaşmaya, düzenli veri saklamak yerine giderek düzensizleşmeye başlar. Bir sınavın sorularını saklamayı düşünelim. Diyelim ki her sınavda bölümler, bölümlerde sorular, sorularda da şıklar olsun. Bunun için nasıl bir tablo yapmamız gerekir? Bir tabloda hem soru hem de şıklar saklanamaz. Bu yüzden birden çok sayıda tablo yapmak zorunda kalırız ver aralarında 'ilişki' (relation) kurmak gerekli hale gelir. Tablolar Sınav, Bölüm, Soru ve Şık şeklinde dört adettir. Üstelik aynı sınavın sorusu bir tabloda şıkkı başka tablodayken, bir sınavın sorusu ile başka sınavın sorusu aynı tabloda yer alır. Bir sınavdaki soruları öğrenmek için dört tablodan veri toplanması gerekir. Oysa XML ne kadar karmaşık yapıda olursa olsun veriyi bir arada tutar ve kolayca erişim sağlar.
HTML'de veri belli bir yapı içerisinde bulunur. Ancak bu yapı bilginin gerektiğinde erişilebilmesini değil, belli bir biçimde ekranda gösterilmesini sağlar. HTML içerisindeki veriye kolay kolay erişemezsiniz. Bir yazının başlığını bir kişi H1 etiketini kullanarak gösterir, başka bir kişi H2. Hatta font'u büyük vererek de başlık verilebilir. Bu durumda HTML belgesi içinde belli bir verinin tam olarak nerde olduğunu bulmak mümkün değildir. HTML, veri (data) ile biçim (style)'ın iç içe olduğu bir yapıdır. Oysa XML'de veri ayrı biçim ayrı tutulabilir. Aynı biçimle bir çok veri gösterilebilirken aynı veri bri çok biçimde gösterilebilir.
Bir sınavı XML olarak belirmek için şöyle bir yapı kurmak yeterlidir.
<exam id="math-3"> <title>Matematik Dersi 2. Ara Sınavı </title> <question number="1"> <text>İki kere iki iki kaç eder?</text> <option id="a">22</option> <option id="b">3</option> <option id="c">4</option> <option id="d">5</option> </question> <question number="2"> <text>Kendimi kendimden çıkarsam kaç kalır?</text> <option id="a">1</option> <option id="b">2</option> <option id="c">0</option> <option id="d">FD</option> </question> </exam>
Burada veri belki daha çok yer kaplar ama artık herhangi bir veriye ulaşmak çok basittir. Belki bir kişinin kendi yazığı bir programla bu belgeden veri alması daha zordur ama en azından araya bir şey eklenirse veya çıkartılırsa program yanlış bilgiye erişmez. Dahası, bir XML belgesinden herhangi bir bilgiyi almak için çeşitli olanaklar bulunaktadır. Programcı her zaman kendisi bir şey yapmak zorunda kalmaz. Örneğin XPath'le ilk sorunun 2. şıkkına erişim için
/exam/question[number="1"]/option[id="1"]]
yazmak yeterlidir. Aynı şekilde 2. sorunun metnine
/exam/question[number="1"]/text
şeklinde erişmek mümkündür. XPath olmadan da bir 'parser' programla XML belgesi programlar tarafından okunması için 'document' nesnesine okunabilir.
XML'in bütün espirisi bir veriyi metin olarak saklamak ve gerektiğinde kolayca erişmektir. Bu, göründüğünden çok daha güçlü özelliktir.
Her XML birimine document denir. Bu genellike bir dosyaya karşılık gelir. Document'ler element'lerden oluşur. Element içerisinde belli bir bütünlük içeren veridir. Bir belge içerisinde herşeyi içine alan bir ana element olmalıdır ki buna 'root' veya da 'document element' denir. Her element attribute'lerden, child element'lerden ve text'lerden oluşur. Attribute bir element hakkında bilgi veren özelliklerdir. Text'se bir element'in içinde bulunan düz metindir. XML'de element, attribute ve text gibi birimlere node denir. Burda anlatılan yapı sadece XML için değil HTML ve JavaScript gibi DOM standardını destekleyen bütün yapılar için geçerlidir.
Yazım kurallarına uygun olarak yazılmış bir belgeye 'well-formed' denir. Ancak bu içerisindeki verinin mantıksal olarak doğru yapıda olduğu anlamında gelmez. '<' ile başlayan bir etiketi '>' ile kapatmak gibi kurallara uymak anlamına gelir. Bir XML belgesinin mantıklı bir veri içermesi durumunda 'valid' olur. Örneğin sorunun içine şık koymak yerine şıkkın içine soru koyarsanız veri yine well-formed olabilir, ama valid olmaz.
XML'le birlikte bir çok dil ortaya çıkmıştır. Bir XML document'inde ne gibi element'ler ve attribute'ler olduğunu göstermek için kullanılan dile DTD denir. DTD ile benzer bir işlev gören ancak element ve attributelerin değerlerinin geçerlilik kriterlerini belirleme gibi fazladan özellikleri bulunan XSchema diye bir dil daha vardır ki bu dil de aslında XML'le yazılmıştır. Bir XML document'inde belli bir düğümün konumunu belirtmek için XPath kullanılır. Bir XML'i başka bir biçime, yani başka bir XML'e, düz metne veya HTML'e dönüştürmek için XSL kullanılır. XSL'de bir XML dilidir. Bir XML belgesinden diğer bir XML belgesine bağlantı kurmak için XLink, aynı XML belgesinde bir düğümden diğerine işaret etmek için XPointer kullanılır.
XML'in çok fazla uygulaması bunmaktadır. XHTML, HTML'in XML versiyonu; MathML matematiksel ifadeleri belirlemek için kullanılan bir dil; SVG iki boyutlu grafikleri metin yoluyla oluşturmak için kullanılan bir dil, SMIL multimedya bileşenlerini birlikte kullanmak için kullanılan bir dildir. Ancak XML bunlarla sınrılı değildir. Hatta her programcının kendine bir veya daha fazla dil oluşturabilir.
Bir metin dosyasına '.xml' uzantısı verilip içerisine well-formed bir XML belgesi yazarsak herhangi bir uygulama tarafından işlenebilecek bir belge oluşturmuş oluruz. Yapılacak işlemleri sırasıyla verirsek :
Eğer yarattığınız XML dosyası XML açabilen herhangi bir programda hatasız açılabiliyorsa XML 'well-formed' demektir. Bu şekilde Java veya herhangi bir programlama ortamına ihtiyaç duymadan XML çalışabilirsiniz.
Bir XML belgesinde olması gereken tek şey bir root element'tir. Yani
<exam/>
şeklindeki ifade yeterlidir. Zorunlu olmamakla birlikte 'prolog' denilen giriş kısmı genellikle konur
<?xml version="1.0" encoding="ISO-8859"?>
Bir XML document'inde prolog 'version' ve encoding bilgisi içerebilir. Burada version XML'in versiyonudur, aşağıda kullanılan herhangi bir xml dilinin değil. Genellikle 1.0 konur. Zaten bu yazının yazıldığı tarih itibariyler sadece 1.1 versiyonu bulunmaktadır ki sadece az kullanılan dillerin karakter kodlamalarını desteklemek gibi çok önemli olmayan değişiklikler içermektedir. Belgelerdeki 'encoding' önemlidir, türkçe karakterle için türkçe encoding (ISO-8859-9)vemek gerekir. Encoding değeri olarak 'UTF-8' de verilebilir.
Aşağıdaki metni bir dosyaya kaydedederseniz geçerli bir XML belgesi yazmış olursunuz.
<exam id="math-3"> <title>Matematik Dersi 2. Ara Sınavı </title> <question number="1"> <text>İki kere iki iki kaç eder?</text> <option id="a">22</option> <option id="b">3</option> <option id="c">4</option> <option id="d">5</option> </question> <question number="2"> <text>Kendimi kendimden çıkarsam kaç kalır?</text> <option id="a">1</option> <option id="b">2</option> <option id="c">0</option> <option id="d">FD</option> </question> </exam>
Buradaki XML'in konulduğu örnek :