Daha önce Ontoloji Mühendisliğine Giriş ve Semantic Web Vizyonunu anlatmıştım. Bu yazımda da XML‘i anlatmadan önce ufak bir örnek ile gerekli bazı şeyleri anlatmak istiyorum.

kitapci

Şekilde görülen A ve B iki kitapçıdır. Birbirlerine sorgu gönderek kitap sordurmak istiyoruz. Bir nevi takas etme yani. Fakat A ve B kitapçıları farklı yapılar kullanıyorlar. Bu da sorun oluşturuyor tabiki. Fakat buna rağmen aralarında anlaşmak istiyorlar. Peki nasıl olur bu anlaşma? A B’ye “X isimli kitabın fiyatı nedir?” diye bir sorguyu nasıl gönderecek? Ne sorgusu olacak bu? Oracle mı? E eğer Oracle sorgusu olursa B sadece XML biliyor nasıl anlayacak bunu? Yani aklımızda deli sorular oluşuyor. 🙂 Bu iki kitapcının konuşup anlaşabilmesi için ortak bir dile ihtiyaç vardır. Yani ortak dilimiz sözlük olsun. Artık sorgumuz ortak dile yani sözlüğe dönüşsün. Herkes sorgularını sözlük yapısında yollasın. Bu şekilde anlaşılabilir mi peki? Elbette anlaşılır. Çünkü A ve B hem kendi dillerini biliyorlar hemde sözlüğü biliyorlar. Yollanacak sorgu ve cevaplar artık sözlükdeki dile dönüştürülecek ve bu şekilde yollanacak. Böylelikle anlayacaklar birbirlerini. Bu dönüştürme işlemini ya kendisi yapıyor yada ortak bir şey oluyor ki buna da broker diyorlar o yapıyor.

kitapci2

Görüldüğü gibi bir standart oluştu.

Şimdi gelelim XML‘i anlatmaya. HTML‘den nasıl farkı varmış bir görelim.

Bilindiği gibi HTML, bize tagler veriyor. Bizde bu tagleri kullanarak verinin gösterimini belirliyoruz. Fakat bu verinin yapısı veya anlamı ile ilgili değil. Şimdi şöyle bir örneğe bakalım.

Bu HTML koduna baktığımızda biz ne anlıyoruz? Bunun bir kitap ve yazarlarını gösterdiğini ve bu kitabın iki yazarının olduğunu, yazarlarının isim ve soyisimlerinin olduğunu biz çıkarsama yapıyoruz. Peki makineler tarafından düşünürsek? Makinelerin bunu anlaması mümkün değil. Biz bu zamana kadar öğrendiğimiz bilgiler doğrultusunda bu HTML kodunda yazanı anlıyoruz. Yani makineninde önce burada yazanların en altına kadar ne olduğunu bilmesi gerekiyor. Kitap ismi dedik. Burdaki kitap ne demek? İsim denilen şey ne demek? Bunları da açıklarken kullanılan kelimeler ne anlama geliyor? Bunların hepsini makineye açıklamak gerekiyor. Yani bu HTML‘e bakarak makineler, “Bu kitabın ismi ne?”, “Yazarları kim?”, “ISBN numarası nedir?” gibi sorgulara cevap veremiyor.

İşte bu HTML‘i daha güzel bir hale getirerek XML oldu. XML‘in en önemli güzelliği belirli taglere bağımlı olmamanızdır. XML genişletilebilirdir(extensible). Bu yüzden de istediğiniz tag’i oluşturabilirsiniz.  Şimdi bu örneğimizi XML’e çevirelim.

Burada diyoruz ki book diye tag oluşturalım ve kitaplar bunun içerisinde dursun. İşte bu şekilde sorgulanabilir hale geldi. Peki binlerce kitaptan oluşan bir doküman var, bunlar nasıl sorgulanır? Bunu yapabilmek için tagleri biliyor olmamız gerekiyor. Taglerin nasıl kullanacağını biliyor olmak gerekir. Kitabın içerisinde author vardır, author birden fazla olabilir, bunları bilmem gerekiyor ki sorguyu oluşturabileyim. Book’un title diye bir özelliği var ismini orada tutarım. Year’ın 4 rakamdan oluştuğunu biliyor olmam gerekiyor belki. Çünkü bunları bilmeliyim ki sorguladıktan sonra gelen cevabı otomatik kullanabilsin.

XML‘in HTML‘e göre büyük avantajları bulunmaktadır. HTML tamamen insanın okumasına bağlıyken burada artık karşılıklı anlaşma var. Taglerle anlaşmışsan iki tarafıda anlaştırmış oluyorsun.

Dünya çapında da kullanılan standartlar var artık. Mesela MathML diye bir dil var. Demişlerki matematik alanındaki tüm formülleri, deyimleri biz tanımlayalım, herkes bunun üzerinden konuşsun. Standartlaştırılmış. Bunun gibi daha bir sürü dil bulunmakta.

HTML‘in tamamen insanların okuması üzerine bir dil olduğunu söylemiştim. İnsanlar için bunun bir sorunu yok fakat makineler bunları yazılımlar ile otomatik işlesinler istiyoruz. Hatırlayacağınız üzere iki birimin birbiriyle haberleşebilmesi için tek yol ortak bir sözlük kullanmasıydı. Ortak sözlük oluşturmak da standart oluşturmak anlamına geliyor aslında.

XML örneğimize geri dödüğümüzde, birincisi book diye bir element tanımlayabiliyoruz. Bu şekilde bookları sorgulanabilir hale getirdik. Bir ikincisi, publisher elementi book elementi içerisinde geliyor. Yani aslında Object Oriented‘dan hatırlayacağınız gibi 2 nesneyi birbirine bağlıyoruz ki bir book’un bir publisher’ı vardır diyoruz. Publisher burda konsept oluyor. Bir konsept tanımlıyorum ve konseptler arasındaki ilişkileri tanımlayabiliyorum. Diyorum ki, book da bir tane title vardır, birden fazla author vardır, bir publisher’ı, bir ISBN numarası vardır. Daha ileri gittiğimizde yearda da göründüğü gibi kısıtlamalar tanımlayabiliyoruz. Diyebiliriz ki title stringdir. Yazar ve publisher da stringtir. Year 4 digitten oluşan bir rakamdır. Yani gidipte buraya Ali, Veli yazmaya çalışma, bu hatalı bir doküman oluşturur. Hatalı bir doküman oluşturmak çok sıkıntılı bir durum. Standartların dışına çıkmış olursunuz. Yani biz 4 digitten oluşan bir sayı beklerken bize Ali gelirse anlaşamayız. Karşı taraftaki yazılım bunu işleyemeyecektir.

Konseptler, konseptler arası ilişkiler ve değerler üzerinde kısıtlamalar tanımlayabiliyoruz. Hepsi de karşı taraftaki yazılımın benim XML dokümanımı sorgulaması için gerekiyor.

Yine hatırlatmak gerekirse; HTML görüntüyle ilgiliyken, XML blginin yapısıyla, içeriğiyle ilgilidir.

Bir bilgi birden fazla şekilde gösterilebilmektedir. Dolayısıyla biz XML kullandığımızda verinin içeriğinin görünümünden soyutlamış oluruz. HTML tamamen görünüm üzerine olduğu için bu şekilde yapamayıp içeriği görüntünün içerisinde tutuyorduk. Ama bakın istiyoruz ki veri ayrı gösterilsin, görüntü ayrı. Yani katmalı olsun.

Standartın önemi de şudur; biz yazılımımızı x1 standartına uygun şekilde geliştirirsek artık “Benim yazılımım, benim sistemim x1 standartına uyumlu şekilde çalışabilir.” der haline geliyoruz. Bu önemli bir şey.

Evet, her XML dokümanında 3 kısım bulunmaktadır. Başlangıç(prolog) kısmı, elementlerin oluşturulduğu kısım, fonksiyonel olan kısım.

Prolog(Başlangıç) Kısmı: Başlangıç tanımlamalarının yapıldığı kısımdır. Kullanılan XML versiyonu, dışarıdan dosya kullanılıyorsa bunlar tanımlanır.

Elementlerin Oluşturulduğu Kısım: Asıl kısım burasıdır. Element dediğimiz aslında herşeydir. Hakkında konuşmak istediğimiz, hakkında bilgi vermek istediğimiz ve işte A ile B arasındaki anlaşmayı sağlayan ortak sözlükte olmasını istediğimiz her şey. Neyin üzerinde anlaşmak istiyoruz? Kitap mı? Yazar mı? Kalem mi? Bilgisayar mı? İnsan mı? Konseptler burada yer almalı. Konseptler arası ilişkide tanımlayacağız.

Şimdi bir element nasıl tanımlanıyor ona bakalım. Her element için bir açma tagi, içeriği ve kapama tagi var. Eğer uymak zorunda olduğumuz bir standart yoksa element ismi yazarken tamamen özgürüz.

lecturer

Burada bir lecturer tamımladığımızı ve isminin David Billington olduğunu, eğer karşı taraf bu dili anlıyorsa, tagin ne olduğunu biliyorsa veya lecturer tagi içerisinde yazar ismi göndereceğim ben demişseniz karşı tarafa iletmiş oluyorsunuz.

Bir elementin içerisindeki içerik 3 şeyden oluşabilir. Birincisi string tutabiliriz. İkincisi diğer elementlerden oluşabilir. Yani diğer elementleri içerebilir. Üçüncüsü boş küme olabilir. Yani hiçbir şey içermeyebilir.

Bu bir iç içe geçmiş element tanımlamasıdır. Nesting diyorlar. Lecturer’ın name’i ve phone’u var demiş oluyoruz bu şekilde.

Bu da boş element tanımlamasıdır. Lecturer tanımlanıyor ve hemen kapatılıyor. Açma tagi, kapama tagi içeriği boş küme.

Bir üstte gösterdiğim boş element tanımlaması bu şekilde de yapılmaktadır. İkiside aynı şey. Burada tagi açarken kapatıyoruz aynı zamanda.

İçeriği boş olan element anlamsal olarak hiçbir şey ifade etmez. Fakat attribute ekleyebiliriz.

Attributeler, elementin içeriğine değilde doğrudan kendisine verebildiğimiz atomik değerler içeren propertylerdir. Classlardaki primitive(string, int, date vb.) tipli string olabilen class attributeleri gibi. Örneğin;

Bunun içeriği boş fakat name ve phone attribute’ü eklemişiz. Daha önce tanımladığımızla anlamsal olarak aynı. İki türlüde kullanabiliyoruz. Primitive tipleri attribute yapabiliriz.

Her attribute, primitive türe sahip olmasından dolayı elementin içeriğinde başka bir element olarak tanımlanabilir.  Aynı anlama geliyor. Peki tersi doğru mudur? Her element attribute olabilir mi? Olamaz. Primitive tip içeriyorsa ancak olabilir. İç içe geçmiş elementler attribute olarak tanımlanamaz.

Bir sipariş numarası, müşterisi olan, içerisinde 2 tane item’ı olan, bu itemların her birinin içerisinde de numara ve miktarı belli olan bir sipariş kalemidir. Bu örnek “a528 numaralı itemdan 1 tane, c817 numaralı itemdan 3 tane John Smith’e 10.10.2016 tarihinde sipariş edilmiş.” anlamına gelmektedir.

Görüldüğü gibi konseptleri tanımlıyoruz. Diyoruz ki orderın içerisinde orderNo vardır. Bunu kullanabilmesi için karşı tarafın orderNo’nun ne olduğunu bilmesi gerekir. Karşı tarafla anlaşmak istiyorsam karşı tarafa bu kuralları söylemeliyim. Demeliyim ki orderNo integerdır veya quantity integerdır. Sen bunları alırken integer olarak çekmelisin. Fakat şu anda öyle bir şey yapmadık. Şu an sadece veriler ile ilgileniyoruz. Bunları üst verilerde tanımlayabiliriz. order nedir? item nedir? itemNo nedir? Bunları henüz açıklamış değiliz. Yani elimizde üst veri yok. Bunların hepsi veri.

Çoğu programlama dillerinden bildiğimiz gibi burada da comment satırları şu şekilde gösterilmektedir:

Dosyalarda şu şekilde tanımlanabilmektedir:

Peki formatlı XML dosyaları nasıl oluşturulur?

  1. İyi yapılandırılmış, iyi formatlanmış bir XML dokümanı başlangıçta ilk olarak syntax olarak doğru kurallar ile yazılmış olmalıdır. Yani sözdizimsel kurallara uyulmalıdır. Tıpkı programlama dillerindeki gibi.
  2. Her XML dokümanında bir root element vardır. Tıpkı ağaç veri yapısında olduğu gibi.
  3. Her element bir açma ve kapama taginden oluşur. Tagler overlop edilemez. Yani bir elementi kapamadan başka elementi kapayamayız. Bu şekilde zaten bu XML dokümanını karşı taraf çalıştıramaz.
  4. Bir element içerisindeki attributeler aynı isimde olamazlar. 2 aynı isimli element olabiliyor ama 2 aynı isimli attribute olamıyor.

Ağaç(Tree) Veri Yapısının Kuralları:

  1. Her zaman bir tane root element olmalıdır.
  2. Hiçbir şekilde cycle’a izin vermez.
  3. Root eleemnt olmayan her node’un mutlaka bir ebeveyni vardır. 2 olamaz 0 da olamaz.
  4. Her node bir etikete sahiptir ve elementlerin sırası önemlidir. Attributelerin sırası önemli değil.

Evet baya bir şey anlatılmış oldu. 🙂 Fakat buraya kadar ki kısım tamamen XML de veriyi nasıl tutabiliyoruzdu.

Gönderdiğimiz veriyi bilgi haline dönüştürmeliyiz. Veriyi bilgi haline dönüştüren de üst veri(metadata)dir. Metadata oluşturmak için XML teknolojisinde 2 yol bulunmaktadır. Birincisi DTD şemalar(daha eski olan yöntem), ikincisi XML Schema teknolojisi.

Bu konularıda ayrı birer blog olarak anlatacağım. Şimdilik anlatacaklarım bu kadardı. İyi çalışmalar. 🙂

839 Total Views 1 Views Today
Share on FacebookTweet about this on TwitterShare on Google+Share on LinkedIn