You are on page 1of 44

XML

Temel özellikleri , İşlenmesi ve İlgili


Teknolojiler

Hazırlayanlar: Levent Tanın


Mehmet Gürsul
Tolga Ovatman
İçindekiler

1. Giriş ve Özet
2. XML Tarihi
3. XML’in Genel Özellikleri ve Kullanımı
3.1. XML Nedir?
3.2. XML Nasıl Kullanılabilir?
3.3. Neden XML?
3.4. Örneklerle XML Sözdizimi , Özellik ve Eleman Kullanımı
4. XML İşleme (XML Processing)
4.1. DTD’ler
4.2. Bir DTD Yaratmak
4.3. Özellikler(Attributes) İle Çalışmak
4.4. XML Ayrıştırma (XML Parsing)
4.4.1. SAX (Simple API for XML)
4.4.2. DOM (Document Object Model)
4.4.3. XPath
4.4.4. XPointer
4.4.5. Xlink
4.4.6. “XML Parser” ları (XML Ayrıştırıcıları)
4.5. XML Şema (XML Schema)
4.5.1. XML Şema’nın içyapısı
4.6. Well-Formed ve Validated XML Belgeleri
4.6.1. “Well-Formed” Belge
4.6.2. Geçerli Belge(VALID)
5. İlgili Teknolojiler
5.1. XSL (eXtensible Stylesheet Language)
5.1.1. XML'in Sunulması (CSS-XSLT)
5.1.2. XQuery
5.2. XHTML (eXtensible HyperText Mark-up Language)
5.2.1. XHTMLin Getirdiği Yenilikler:
5.2.2. Neden XHMTL?
5.2.3.XHTML Çeşitleri
5.2.4. XHTML Belgelerinin Özellikleri
6.Teşekkür

Kaynakça
1. Giriş ve Özet

XML tam anlamıyla bir standart haline gelmemiş olmasına rağmen geleceğin web
tabanlı uygulamalarında alt yapıyı oluşturacak en büyük aday olarak görünüyor. Bu açıdan
bakıldığında, XML’in günümüzdeki popülaritesi ve XML ile ilgili teknolojilerin her geçen
gün daha hızlı bir şekilde artması daha rahat anlaşılıyor.

XML, ortaya çıkış düşüncesiyle insanlar için HTML’den çok daha rahat ve kullanımı
kolay bir dil olmayı amaçlıyor. Bununla beraber uygulamada HTML’in yetersiz kaldığı
konulara da eğilerek aynı zamanda da teknik açıdan günümüzde HTML’in açıklarını
yamamaya çalışan birçok programı ortadan kaldıracak gibi gözüküyor.

İçerisinde barındırdığı kolay kullanım ve teknik genişlik konularıyla sıradan


kullanıcılar için kullanım kolaylığı sağlamakla birlikte teknik geliştiriciler açısından çok geniş
bir XML teknolojileri dağarcığına sahip olmayı gerektiriyor. Bu belge, XML temelinden
başlayarak sıradan kullanıcılara dilin sözdizimi ve genel özellikleri hakkında bilgi verirken ,
konuyla ileri düzeyde ilgilenmek isteyenlerde de XML ile ilgili teknolojiler hakkında
başlangıç için yeterli düzeyde açıklamalar sunuyor.

Belge içerisinde öncelikle XML fikrinin ortaya atılışını ve tarihi incelenecektir , bunun
ardından XML sözdizimi ve genel özelliklerine değinilecektir. XML genel özelliklerinden
sonra XML’in işlenmesi konusunda XML DTD’leri ve şemalar incelenecek bir XML
belgesinin hazırlanmasından sunumuna kadar üzerinde yapılan işlemler açıklanacaktır. Son
bölümde de ilgili XML teknolojileri ile ilgili olarak XSL ve XSLT ile XML belgelerinin
sunuma hazır hale getirilmesi ve son olarak da XQuery ve XHTML konuları ile XML’den
tüeryen teknolojiler incelenecek.

2. XML Tarihi

1960’larda IBM mühendisleri belgeleri ve belge biçimlerini tanımlamak için bir


GML(genelleştirilmiş işaretleme dili) üzerinde çalışıyorlardı. 1986’da ISO
SGML(Standartlaştırılmış GML) adında bir standardı kabul etti. SGML belge görünümlerini
özel uygulama yazılımlarından bağımsız kılmak için belgeleri işaretlemeyi öngören çok
gelişmiş bir dizgeydi. Belge standartlarını kesinleştirmeye ihtiyaç duyan büyük
organizasyonlar için SGML çok uygundu ve güçlü seçenekleri vardı. SGML platform-
bağımsız ve uygulama-bağımsız belgeler yaratmak için oluşturulmuştur ve özel tanımlanmış
etiketler (tag) kullanarak belgelerin yapısını tanımlamamızı sağlar.

Daha sonraları görüldü ki SGML’in gelişmişliği, hızlı ve kolay web yayınları için
uygun değildi. Bu nedenle herkesin kolayca öğrenip uygulayabileceği pratiklikte basit bir
işaretleme diline ihtiyaç duyuldu. Böylece SGML’in özel bir belge tipi (ya da DTD) ‘nden
biraz daha fazla kapsamlı olan HTML geliştirildi. Öğrenilmesi ve uygulanması kolay olduğu
ve öncü web tarayıcıları tarafından desteklendiği için HTML yeni gelişmekte olan web’in
süratle temelini oluşturmaya başladı. Gerçekten de eğer SGML web’in geçerli işaretleme dili
olarak kullanılsaydı web şu andaki popülaritesine kavuşamazdı.

Fakat HTML’in sorununun çok yalın olmasından kaynaklandığı hemen görüldü.


Başlıkları, listeleri, diğer belgelere bağları(link) içeren, metin tabanlı belgeleri kullanan
web’in ilk günlerinde HTML çok uygun bir işaretleme diliydi. Kısa zamanda web uygulaması
geliştiren insanlar çoklu ortam ve sayfa tasarım olanaklarının arttırılmasını istemeye
başladılar. Bu da HTML’in şiddetli büyüme sorunları yaşamasına neden oldu. Yalın bir
şekilde metin içine resim yerleştirmek iyiydi fakat yerleştirmenin her zaman tam olarak
istenilen yere yapılamaması tasarımda sıkıntı yaratıyordu. Görüntü haritaları oluşturmak ve
bunlara bağ atamak yeni problemler yaratıyordu ve yeni çözümler gerektiriyordu. Sonrasında
yanıp sönen metinler, çizelgeler, çerçeveler ve devingen HTML ortaya çıktı. Her zaman
HTML’e yeni bir şeyler ekleme ihtiyacı hissediliyordu fakat bu ekleme çabaları her defasında
uyumsuzluk yaratıyor ve yeni standart ihtiyaçları ile sona eriyordu.

Bu sorunların nedeni çok açıktı, HTML genişleyebilir değildi. Yıllar geçtikçe


Microsoft sadece Internet Explorer’da , Netscape ise sadece Navigator’da çalışacak yeni
etiketler çıkardı. Ne yazık ki web uygulaması yazanlar böyle bir şansa sahip değillerdi.

Karmaşık siteler tasarlanabilmesi için daha çoğuna ihtiyaç duyuluyordu. Java ve


JavaScript, ASP, CGI, PERL, PHP ve diğer bütün gelişmeler HTML’i kuvvetlendiriyordu.
CSS (Cascading Style Sheet) ve devingen HTML(DHTML) gibi gelişmeler web tasarımını
istenilen hale getirmek için gerekli olan gücün bir kısmını öneriyordu. Bununla beraber bu
eklemeler büyümekte olan sorunu daha da göz önüne çıkarıyordu.

Birçok Web uygulaması geliştiricileri , HTML genişleyebilir değilken onun ana dili
olan SGML’in tam genişleyebilir olduğunu biliyorlardı. SGML’de tamamen özelleştirilebilir
belge kümesi oluşturmak amacıyla, uygulama geliştiriciler tüm bu belge kümesini
denetleyecek bir DTD geliştirdiler. Bu zaman alıcı ve karmaşık bir işti ama işe yaradı. Asıl
sorun SGML’in genişleyebilir olan özelliğini karmaşıklığından arındırabilmekti. Diğer bir
deyişle amaç SGML ve HTML arasında bir köprü kurabilmekti.

Sonuçta XML(eXtensible Markup Language) geliştirildi. 1996 sonlarında World


Wide Web Consortium (W3C) XML’i geliştirdi. XML’in amacı SGML’in gücünü dilin
karmaşıklığından arındırıp web uygulaması geliştirenlere tam anlamıyla özelleştirilebilen
belgeler hazırlama olanağı sunmaktı. HTML, SGML’in bir belge tipiyken XML onun
basitleştirilmiş bir biçimi gibiydi bu yüzden de yukarıda bahsedilen özellikleri taşıyordu.

3. XML’in Genel Özellikleri ve Kullanımı

3.1. XML Nedir?

XML, HTML ile pek çok açıdan benzerlik gösteren bir işaretleme(markup) dilidir.
Verinin tanımlanması ve tarif edilmesi için kulanılır. HTML’deki yapının aksine XML’de
kullanılacak olan etiketler önceden tanımlı değildir.Yani bir XML belgesinin yapısı tamamıyle
kullanıcı tarafından oluşturulur.Verinin tarif edilmesi için DTD(Document Type Definition
(XML belgesinde kullanılacak etiketleri ve yapıları önceden tarif ettiğimiz kütükler)) adı
verilen yapılar kullanılmaktadır. XML ve DTD’nin birlikte kullanılması ile belgeler kendini
tarif eden bir yapı halini alırlar.

XML, SGML’den türetülmiş bir dildir. SGML bir meta-dildir. Meta-dil demek dil
yaratmaya yarayan dil demektir. İlginç olan XML'in SGML gibi bir meta-dilden türemesine
rağmen kendisinin de bir meta-dil olmasıdır. Yani XML'den de yeni diller türetilebilir.
Örneğin Wireless Markup Language(WML) mobil cihazları için kullanılan WAP ortamlarının
dilidir ve XML’in türevidir. HTML de SGML’den türetilmiş bir dil olmasına rağmen bu
özelliği taşımaz.

XML ve HTML arasındaki en belirgin fark XML’in verinin kendisiyle ilgilenmesi,


HTML’in ise verinin sunumuyla ilgilenmesidir. Buna bağlı olarak HTML belgeleri veriye
ilişkin şekillendirme bilgilerini içerirken, XML dökümanları ise verinin tanım bilgilerini
içermektedir. XML’in tasarım amaçlarından biri de verinin taşınmasıdır.

Şimdi çok basit bir XML belgesini birlikte inceleyelim:

<not>
<kime>Mehmet</kime>
<kimden>Levent</kimden>
<başlık>Kutlama</başlık>
<ileti>Doğum Günün Kutlu Olsun!!</ileti>
</not>

HTML belgelerine çok benzeyen bu yapıda ilk etapta göze çarpan nokta etiket
yapılarının bizim tarafımızdan tasarlanmış oluşudur. XML kütükleri her zaman belgelerin
mantıksal bölümlerinin(element) başlangıç ve bitişlerini işaret eder.

HTML’de kullanılan <p> ve <h1> gibi standart etiket yapıları yukarıdaki XML
belgesinde kullanılmamıştır. Bahsedilen bu özelliği nedeniyle XML belgeleri
genişleyebilir(extensible) bir yapıya sahiptir.Belgelerin bu hali gerçek anlamda herhangi bir
şey ifade etmez. Belgenin iletimi(gönderim veya alım) ya da sunumu için başka şeylerin de
yapılması gerekmektedir.

Buradaki önemli nokta şudur: XML, HTML’in yerine geçecek bir dil değil
HTML’in tamamlayıcısı olabilecek bir dildir. Günümüz bilişim dünyasına bakarsak
XML’in her alanda karşımıza çıktığını görmekteyiz. Bu nedenle XML’i bir anlamda geleceğin
web dili olarak tanımlamak mümkündür.

XML kullanıcıya şunları sunar:


• Çoklu kütükleri birleştirerek, bileşik belgeler yaratmak
• Metin kütüklerinde, istenilen yere ve istenilen formatta resim eklemek
• Belge geçerleyiciler ve tarayıcılar gibi programlara bilgi denetim işlemini sağlamak
• Kütüğe, açıklama satırları eklemek

Fakat unutmamak lazımdır ki, XML’de şunlar bulunmaz:

• HTML’deki gibi, belgeleri işaretlemek için, daha önceden tanımlanmış etiketler.


• Belirli tiplerdeki belgeler üretmek için standart bir şablon.

XML tasarlanırken ortada birçok düşünce vardı. Sonuçta, W3C XML’in tasarım
amaçlarını açıkladı:

1- XML internet üzerinde çalışabilmelidir.


2- XML tüm uygulamalar tarafından desteklenmelidir.
3- XML, SGML ile uyumlu olmalıdır.
4- XML üreten programlar oldukça kolay olmalıdır.
5- XML’de seçmeli özellikler minumum olmalı veya hiç olmamalıdır.
6- XML belgeleri okunabilir ve açık olmalıdır.
7- XML tasarımı tek bir firma bu işi ele almadan acilen hazırlanmalıdır.
8- XML tasarımı biçimlendirilmiş ve kısa olmalıdır.
9- XML belgelerinin yaratılması çok kolay olmalıdır.
10- XML belgelerinde anlam belirsizlikleri olmamalıdır

3.2. XML Nasıl Kullanılabilir?

XML hakkında bilinmesi gereken en önemli nokta, bu dilin veriyi taşımak amacıyla
tasarlanmış oluşudur.

XML ile veriler yapı bakımından modülerlik kazanmaktadır. XML belgeleri verinin
içeriğiyle ilgilenmektedirler.Bu sayede verilerin içerik,yapı ve sunum kısımları ayrı modüller
halinde farklı XML belgelerinde tutulmaktadır.

XML belgeleri Veri Adaları(Data Islands) adı verilen teknik sayesinde HTML sayfaları
içerisinde de depolanabilmektedir.Bu teknik sayesinde verinizin sadece sunumuyla
ilgilenilmektedir

Veri Adaları(Data Islands) bir HTML sayfasında XML komutlarının gömülü olması ve
onların işlenebilmesi demektir. Böylece HTML sayfasının içine artık sadece HTML etiketleri
değil, aynı zamanda XML komutları da yazılabilir

Data Island iki şekilde HTML sayfalarına gömülür:

- Direk XML datasını HTML'in içine gömerek

<XML ID="XMLID">
<iller>
<ilkod>06</ilkod>
<İlad>ANKARA</İlad>
</iller>
</XML>

- HTML sayfasından XML'i referans göstererek.

<XML ID="XMLID" SRC="iller.xml"></XML>

XML ile verinin alışveriş işlemi gerçekleştirilir. XML, yapısının esnekliği sayesinde
birbirine uyumlu olmayan sistemler arasında veri alış verişi rahatlıkla gerçekleştirilmektedir.
Günümüz bilişim dünyasında bilgisayar sistemleri ve veri tabanlarının genellikle birbirine
uyumsuz sistemler içerebildiklerini görmekteyiz. Bundan dolayı uygulama geliştiriciler
Internet üzerinden bu tip uyumsuz verilerin alış veriş işlemini gerçekleştirmek zorundadırlar.

Verinin XML formatına çevrilmesi ile, farklı sistemler ve uygulamalardaki verilerin


karmaşıklık derecesi indirgenerek, alış veriş işleminin kolaylaştırılması sağlanır.
XML ile finansal bilgilerin Internet üzerinden alış verişi sağlanmaktadır. Günümüzde
artık sıklıkla duyulan elektronik iş kavramı açısından incelenecek olduğunda XML’in önemli
işlevleri yerine getirdiği görülmektedir. Bahsedilen bu işevleri ile XML geleceğin elektronik
iş dili olarak da yeni bir görevi üstlenmektedir.

XML ile verinin paylaşımı kolaylaştırılır.

XML, veriyi düz metin (plain text) formatında saklamasından dolayı veriyi
paylaştırma konusunda da hem yazılım hem de donanımdan bağımsız hareket edebilme
imkanını sunmuştur.

Bu sayede farklı uygulamalarda hareket eden farklı veri tipleriyle çalışmak daha
kolaylaşır. Ayrıca işletim sistemlerinin yükseltgenmesi, sunucu, uygulama vb. dışsal
faktörlerin yenilenmesi gibi etkenlerden de en az düzeyde etkilenilmiş olunur.

XML ile verinin depolanması sağlanır.

XML, verinin dosyalarda veya veritabanlarında saklanması için de kullanılabilir.

XML, yazılım, donanım ve uygulamalardan bağımsız olduğu için verinin daha elverişli olarak
kullanımını sağlamaktadır. Yani başka istemci(client) veya uygulamalar tıpkı veri
kaynaklarına erişiyormuş gibi XML kütüklerine rahatlıkla erişebilirler.

3.3. Neden XML?

Bu sorunun cevabını iyi verebilmek için, şöyle bir örnek yararlı olacaktır:

Diyelim ki evde otururken canımız kola istedi. Markete gidip kola almak çok zor bir iş
değil. Markete yürüyüp hızlı ve ucuz bir şekilde ihtiyacımızı giderebiliriz. Üstelik fazla
yüksek bir teknolojiye ihtiyacımız yok. HTML ile web sayfası hazırlamak da birçok yönden
buna benziyor. Eğer düz bir metin düzenleyiciye ve küçük bir HTML bilgisine sahipsek, hızlı
ve ucuzca sayfamızı hazırlayabiliriz. Hatta FrontPage,DreamWeaver gibi programlarla HTML
bilgisine de ihtiyac minimum düzeye indi.

Şimdi ihtiyacımızın daha büyük olduğunu düşünelim. Bir hatta birkaç süpermarkete
uğrayıp, evin haftalık alışverişini yapalım. Bu durumda yürümek pek de akıl karı bir iş değil.
Ayrıca taşıyacağımız yükü de göz önüne alırsak, bir araç vazgeçilmez hale geliyor.

Daha büyük işler için bir araç kullanmanın daha kolay ve daha hızlı olduğu çok açık.
Ama arabanız varsa ona benzin doldurmayı, tekerleklerine doğru hava basıncını yüklemeyi ve
bunun gibi birçok işi bilmemiz gerekir. XML ailesiyle HTML’de yapamadığımız birçok şeyi
yapabiliriz. Fakat tam anlamıyla bunu başarabilmemiz için beraber çalışan birçok teknolojinin
kullanımını bilmemiz gerekir. Sonuçta bir öğrenme engeliyle karşı karşıyayız.

Bu noktada endişeye kapılmak doğal. Fakat unutmamak gerekir ki arabayı kullanmak


için yürüyen aksamın direksiyona nasıl bağlandığı, hareketin tekerleklere nasıl iletildiği,
karbüratörün ne işe yaradığı gibi konularda uzman olmaya gerek yok.

Kolayca görülüyor ki eğer webdeki işimiz küçük ve dar kapsamlıysa, HTML


kullanmak daha kolay ve daha ucuzdur. Fazla ayrıntı bilmeye ve kafamızı karmaşık
teknolojilere yormaya gerek yok. Fakat eğer biraz deneyimli bir kullanıcıysak ve yapacağımız
işte HTML yetersiz kalıyorsa, XML kullanmak kaçınılmaz hale geliyor. Üstelik örnekte de
görüldüğü gibi, bunun için küçük bir miktar daha bilgi bilmek gerekliyken işin fazla
ayrıntısına girmek gerekmiyor.

Şimdi işin teknik ayrıntılarına girebiliriz. “Neden XML?” sorusuna akla gelen ilk
cevap “insanlar arasındaki iletişimi kolaylaştırmak” olabilir. Fakat dikkatlice
düşündüğümüzde insanlar telefon, yazışma gibi iletişim araçları varken neden köşeli
parantezler arasındaki etiketleri kullanmak istesin ki? Bu noktada cevabımız son halini alıyor:
“Asıl amaç bilgisayarlar arasındaki iletişimin iyileştirilmesini sağlanmak.” Biraz daha açacak
olursak XML’in asıl kolaylığı insanların, iki bilgisayarın arasındaki iletişimi daha kolay
anlayabilmesini sağlamaktır.

XML bilgisayarların daha iyi haberleşmesine iki yoldan katkıda bulunur:

• İçeriği gösterimden ayırır. (HTML – XHTML)


• Uygulamalar arasında bilginin doğrudan geçişini sağlar.

Şimdi de XML’in diğer yararlarını madde madde inceleyelim.

Yalınlık: XML’de kodlanan bilgilerin okunması ve anlaşılması kolaydır çünkü doğal


dile yakın anlamlı etiketler insanlar tarafından daha kolay anlaşılır. Ayrıca bu etiketler
bilgisayarlar tarafından da kolayca işlenebilirler.

Açıklık: XML W3C standartıdır ve yazılım liderleri tarafından da onaylanmıştır.

Genişleyebilirlik: Sabit bir etiketler kümesi bulunmaz. Yeni etiketler istenildiğinde


yaratılabilir.

Kendi kendini tanımlama: Alışılagelmiş veri tabanlarında ; veri kayıtları , veri tabanı
sorumlusu tarafından kurulan şemalara ihtiyaç duyar. XML belgeleri bu tür tanımlamalara
ihtiyaç duymadan saklanabilir çünkü XML etiket ve özelliklerden oluşan meta veriler içerir.

Makine tarafından anlaşılabilen bağlam bilgisi içerir: Etiketler, özellikler


(attributes) ve eleman(element) yapıları; içerik anlamını yorumlamada, etkin arama
motorlarında yeni olasılıklar oluşturmada, akıllı veri işlemede (data mining) vb. bağlam
bilgisi sağlar. Bağlam bilgisinin değerlendirilmesinin neredeyse imkansız olduğu HTML veya
düz metine göre bu büyük bir avantajdır.

Örneğin, Chip isimli isimli birini aramak için ‘chip’ kelimesiyle arama yaptığınızda
karşınıza chocolate chips, computer chips, ya da Chip gelebilir. Eğer isim ve adres kayıtları
için tanımlanmış DTD’ler olsaydı, ‘chip’ kelimesiyle yapılan aramalar çok daha kesin ve
doğru sonuşlar verebilirdi.

İçeriği gösterimden ayırır: XML etiketleri, gösterimi değil anlamı tanımlar.


HTML’in parolası :”Nasıl göründüğünü biliyorum!” iken XML’inki : “Ne anlama geldiğini
biliyorum, öyleyse bana nasıl görünmesi gerektiğini söyleyin!”. Bir XML belgesinin görünüşü
ve anlattıkları XSL “style sheet”leri tarafından oluşturulur. Bu, bir belgenin görünüşünün,
belgenin bağlamına dokunmadan değiştirilebilmesini sağlar. Aynı içerikten ortaya çıkan
birçok görünüm veya sunum kolayca oluşturulabilir.

Farklı XSL dönüştürücüler ile aynı XML belgesinden farklı görünüşte sunumlar elde
edilmesi bunun en büyük örneğidir.

Çokdilli belgeleri ve “Unicode”u destekler: Uygulamaların uluslararası hale


getirilmesinde çok önemli bir özellik.

Verilerin kümelenmesi ve karşılaştırılmasını kolaylaştırır: XML belgelerindeki


ağaç yapısı, belgelerin eleman eleman etkin bir biçimde kümelenmesine ve
karşılaştırılmasına izin verir.

Çoklu veri türleriyle kullanılabilir: XML belgeleri, çoklu ortam verilerinden (resim,
ses, video) aktif bileşenlere (Java Appletleri, ActiveX) kadar birçok olası veri türünü
içerebilir.

Varolan veri türleriyle kullanılabilir: Varolan kütük dizgeleri veya ilişkisel veri
tabanlarının XML’le ilişkilendirilmesi çok kolaydır.

Dağıtılmış veriler için tek bir sunucudan görünüş sağlar: XML’in erişim sağladığı
birçok verinin öğeleri değişik veri tabanları içerisinde bulunabilir -örneğin Internet gibi-.
XML ile bu verilere tek bir sunucu üzerinden bakılıyormuş gibi erişilebilir.

Sanayi tarafından hızlıca benimsenmiştir: IBM, Sun, Microsoft, Netscape, SAP


gibi birçok kurum XML’i destekliyor. Microsoft ve SAP şimdiden ileride çıkaracakları
programların sürümlerine XML desteği koyuyorlar. Microsoft ve Netscape’in web tarayıcıları
XML’i destekliyor.

3.4. Örneklerle XML Sözdizimi , Özellik ve Eleman Kullanımı

XML sözdizimi , basit birkaç kuraldan oluşmuştur bu yüzden de kullanılması ve


öğrenilmesi kolaydır. Önceden de incelediğimiz basit XML belgesine tekrar göz atalım:

<?xml version=”1.0”?>
<not>
<kime>Mehmet</kime>
<kimden>Levent</kimden>
<başlık>Kutlama</başlık>
<ileti>Doğum Günün Kutlu Olsun!!</ileti>
</not>

Dökümanın ilk satırında XML bildirimine yer verilir ve hangi XML sürümünü
kullandığımız belirlenir. Bu satırdan sonra XML belgesinde DTD bildirimi de yer alabilir. Bir
sonraki satırda ise belgenin kök(root) elemanı açıklanıyor. Bu belgenin kök elemanı <not>.
XML belgelerinde ilk sırada açıklanan eleman kök eleman olarak adlandırılır ve ondan sonra
gelen elemanlar XML sıradüzenine uyacak şekilde kök elemana bağlı olmak durumundadırlar.

XML belgelerinin yapısı “kök” sözcüğünden de anlaşılabileceği gibi ağaç yapısına


benzer. Bundan sonraki 4 satırda ise 4 çocuk(child) eleman açıklanmıştır. Bu çocuk elemanlar
birbirleriyle kardeştir(sibling). Bunun yanında kök eleman da çocuk elemanlarının atası
(parent) durumundadır. Dikkat edilecek olursa kök,çocuk ve kardeş elemanlar son derece
sıradüzensel , içiçe geçmemiş bir yapı sergiliyor.

Bu sıradüzene göre örneğimizde <not> kök eleman. <kime>,<kimden>,<başlık> ve


<ileti> ise <not> un çocuğudur ve dolayısıyla <not> bu dört elemanın atası durumundadır. Bu
dört eleman aynı zamanda birbirleriyle kardeştir de. <kime> , <kimde> vs. Elemanlarının da
kendi çocuklarına sahip olabileceklerini unutmamak gerekir.
Diğer bir özellik ise XML’in başlangıç ve bitiş etiketi kurallarına sıkı sıkıya bağlı
olmasıdır. HTML’de örneğin <p> ile başlamamız gereken bir paragrafı </p> etiketiyle
kapatmasak bile tarayıcı çoğu zaman bu hatayı gözardı ederek HTML belgesini görüntüler.
XML bunu kesinlikle kabul etmez. Örnekte de görüldüğü gibi açılan bütün etiketler
kapatılmıştır. Bu XML’in kendisinden türetilecek dillere(ör. XHTML) de geçireceği bir
özelliğidir.

XML’in bu nitelikte bir başka özelliği de büyük/küçük harf duyarlı (case-sensitive)


olmasıdır. Bu bağlamda bir elemanın başlangıç etiketinin bitiş etiketiyle tamamen aynı
yazılışta olması gerekir. Bu doğrultuda bir örnek vermek gerekirse:

<yazar> Andrew S. Tanenbaum </YAZAR>

Hatalı bir sözdizimdir. Doğrusu ise:

<YAZAR> Andrew S. Tanenbaum </YAZAR>


veya
<yazar> Andrew S. Tanenbaum </yazar>
şeklinde olmalıdır.

XML sıradüzensel bir sözdizime sahiptir ve bunu bozacak sözdizimleri hatalı olarak
niteler. Örnek olarak aşağıdaki HTML koduna bakalım:

<b><i>Kalın ve eğik metin</b></i>

Görüldüğü üzere önce başlatılan kalınlık niteliği sonra başlatılan eğiklik niteliğinden
önce kapatılmış. Bu şekilde sıradüzenselliği bozan sözdizimler XML’de bulunmaz. Bu kodu
XML sözdizimiyle denetlediğimizi varsayalım:

<b><i>Kalın ve eğik metin</i></b>

Bu haliyle kod, XML sözdizimine uygundur. Daha önceden değinilen kök-çocuk


ilişkisine sadık kalınmış ve XML sözdizimi açısından geçerli bir kod elde edilmiştir.

XML sözdiziminin temel taşı olan elemanların(element) isimlendirilmesinde uyulması


gereken kurallar şunlardır:
• İsimler harf,sayı ya da diğer karakterleri içerebilir.
• İsimler bir sayı veya _ (alt çizgi) karakteri ile başlamamalıdır.
• İsimler “xml“(ya da XML veya Xml) şeklinde başlamamalıdır
• İsimler boşluk içermemelidir.
Şimdi de özellik(attribute) değerlerinin XML sözdizimi içerisinde uyması gereken
kuralları inceleyelim. Baştaki örneğimize geri döndüğümüzde:

<?xml version=”1.0”?>
<not tarih=”20/02/2002”>
<kime>Levent</kime>
<kimden>Tolga</kimden>
<başlık>İlginç</başlık>
<ileti>Bugün çok simetrik bir gün!!</ileti>
</not>
XML elemanları özelliklere sahip olabiliriler. Bu özelliklerin bir ismi ve ona
atadığımız bir değeri vardır. Tabii bazı zamanlar özelliklere değer atayamayabiliriz. Örnekte
de görüldüğü üzere <not> elemanı “tarih” özelliğine sahip. Dikkat edilecek olursa “=” ile
“tarih”e atanan değer çif tırnak içine alınmış. Bu XML sözdiziminin bir özelliğidir.
Özelliklere değerleri , eleman etiketinin içerisinde “=” kullanılarak çift tırnak içerisinde
atılmalıdır. Örnekte de “tarih” özelliğine 20/02/2002 değeri atanmıştır.

Gördüğümüz gibi özellikler elemanlar için ek bilgilerin tanımlanmasına olanak veren


yapı birimleridir. Özellik değerini de ekleyerek ilk baştaki belgemizi biraz daha fazla bilgi
tutabilecek hale getirdik. Şimdi bunu başka yollardan yapmaya çalışalım:

<?xml version=”1.0”?>
<not>
<tarih>20/02/2002</tarih>
<kime>Levent</kime>
<kimden>Tolga</kimden>
<başlık>İlginç</başlık>
<ileti>Bugün çok simetrik bir gün!!</ileti>
</not>

Görüldüğü gibi az önce <not> elemanının bir özelliği olan tarih bilgisi bu örnek bu
elemanın bir çocuğu halinde karşımıza çıkıyor. Bu şekilde tutulan verinin niteliği değişmiyor
ama tutulma şekli değişiyor. Ayrıca bu örneği en baştaki örnekle karşılaştırdığımızda yeni bir
nitlik olan <tarih> in belgenin yapısına hiçbir zarar vermeden belgeye eklenebildiğini
görüyoruz. Şimdi belgeyi biraz daha dğiştirelim:

<?xml version=”1.0”?>
<not>
<tarih>
<gun>20</gun>
<ay>02</ay>
<yil>2002</yil>
</tarih>
<kime>Levent</kime>
<kimden>Tolga</kimden>
<başlık>İlginç</başlık>
<ileti>Bugün çok simetrik bir gün!!</ileti>
</not>

Elimizdeki <tarih> elemanını , alt elemanlara ayırarak parçaladık. Bu şekilde


elimizdeki veriyi daha etkili bir yöntemle saklamış oluyoruz. Üstelik bu çeş,it bir kullanım ile
hata kontrolü ve modülerlik gibi konularda da avantajlar elde etmiş oluyoruz.
Görüldüğü gibi XML sözdizimi açısından pek esnek olmamakla birlikte verinin
saklanması ve temsili açısından son derece esnek bir yapıya sahip. Bu da ona HTML’in aksine
daha teknik ve kapsamlı konularda daha etkili bir biçimde kullanılma olanağı sunuyor.

4. XML İşleme (XML Processing)

XML sadece xml belgesine yazılanlarla kalmıyor. XML belgesinin içerisinde


kullanılan eleman ve özellik yapılarının mutlaka tanımlanmış olması gerekli. Tabii bu kadarı
de yeterli değil. Bu tanımların doğruluğunun denetlenmiş olması ve XML belgesinin bunlara
uygunluğunun da sınanmış olması gerekiyor.

Aynı zamanda XML’in görüntülenmesi ve sunuma hazır hale getirilmesi sırasında


geçtiği aşamalarda da kullanılan birçok araç var. XML işleme konusu XML’in
kodlanmasından sunulmasına kadar geçen sürede geçirildiği işlemlerde (resimde de
görülüyor) kullanılan teknolojileri kapsıyor. XML işleme bölümünde bu teknolojilerden teker
teker bahsedilecek
ve bunların kullanım
yöntemleri ile kısa
örnekler verilerek
genel kullanıma bir
altyapı oluşturulması
sağlanacaktır.

4.1. DTD’ler

a) Document Type Declaration (DTD)

XML belgelerinde kullanılan etiketlerin tanımının önceden yapılmış olması gereklidir.


Etiketler kişiden kişiye farklı olabilir. Bu yüzden bir etiketin, XML kütüğü içerisindeki
işlevini açıklayan tanımların bulunduğu bir DTD (Document Type Definition)’nin varlığına
ihtiyaç duyulur. Bu DTD, XML kütüğünün içinde (içsel altküme), dışında (dışsal altküme
(genellikle .dtd uzantılı) ), ya da bir kısmı içinde bir kısmı dışında olabilir.

İşte bu DTD’lerin gerek içsel ya da dışsal olmasını, gerekse dışsal olması durumunda
DTD’nin adresini XML belgesine sunmak gerekir. Bu amaçla, DTD(Document Type
Declaration) adı verilen bildirim sözcükleri XML belgesine eklenir. Bu yapıyı bir yönüyle,
programlarımıza kitaplık kütüklerinin dahil edilmesine benzetebiliriz. DTD’ler bir XML
belgesinin girişinde yer alır.
Definition ile declaration arasındaki ayrımı tam olarak belirtmek için şunu
söyleyebiliriz: Bir XML belgesinde yeralan declaration, o XML belgesiyle ilişikli olan
Definiton’ı XML belgesine tanıtmakta kullanılır. Örnek vermek gerekirse:

<?XML version=”1.0”?>
<!DOCTYPE kutlama SYSTEM “kutlama.dtd”>
<kutlama>
<kime> Mehmet </kime>
<ileti> Doğum Günün Kutlu Olsun </ileti>
</kutlama>

Burada 2. satırın(declaration) eklenmesi ile, “kutlama” adındaki yapımızın kökünün


“kutlama.dtd” isimli dosya içerisinde bulunduğunu XML Parser’a anlatıyoruz.

Eğer <kutlama> , <kime> , <ileti> elemanlarının hepsi gerekli elemanlarsa ve


“Definition”da yer alıyorsa “kutlama.dtd” şöyle görünecekti :

<!ELEMENT kutlama(kime,ileti)>
<!ELEMENT kime (#PCDATA)>
<!ELEMENT ileti (#PCDATA)>

Eğer “Declaration” kullanmasaydık ve “Definition”larımızı XML belgesinin içine


gömmeye kalksaydık , bunu belgeye şu satırları ekleyerek sağlamak zorundaydık.

<!DOCTYPE kutlama[
<!ELEMENT kutlama(kime,ileti)>
<!ELEMENT kime (#PCDATA)>
<!ELEMENT ileti (#PCDATA)>
]>

b) Document Type Definition

XML gerçekten de çok esnek bir dildir. Bir XML belgesinde istediğimiz özelliklere
sahip herhangi bir elementi dilediğimiz şekilde kullanabiliyoruz. Bu, çok büyük bir güç
getirmekle birlikte büyük bir düzensizlik ve dağınıklık potansiyeline de sahiptir.

Hatırlayacağımız gibi XML teknolojisinin öncelikli amacı iki bilgisayar arasındaki


bilgi alışverişini uygun biçimde sağlamaktı. Anlaşılacağı üzere bu bilgi iletişimindeki ufak bir
dağınıklık kilitlenmelere ve verilerin güvensiz bir biçimde değişimine sebep olabilir.

Çok sayıda eleman içeren bir XML uygulamasının kilitlenmesini kontrol altına
alabilmek için, XML belgelerinde yer alabilecek bazı mantıksal ve pratik kısıtlar koyarak, bu
esnekliği dizginlemek akıllıca olacaktır.

Bir DTD, XML 1.0 ‘da tanımlanmış XML’i kısıtlama mekanizmasıdır. Bir DTD,
kendisini kullanan XML belgesinin örneklerinin yapısını kısıtlar veya tanımlar.

İyi yazılmış bir DTD, kullanılan yapıdan türemiş bir XML belgesinden, XML
işleyicisinin çıkaracağı aykırı durumların tanımlanmasını sağlar. Eğer belge içerisinde birkaç
kez geçen bir eleman, DTD içinde yoksa, uygun bir düzeltme işleminin gerçekleşmesi için
uyarı oluşturulur. Bir başka hata olasılığı ise DTD’de bulunan bir verinin XML belgesinde hiç
geçmemesidir.
Örneğin DTD’miz bu şekilde olsun.

<!ELEMENT kutlama(kime,ileti,kimden)>
<!ELEMENT kime (#PCDATA)>
<!ELEMENT ileti (#PCDATA)>
<!ELEMENT kimden (#PCDATA)>

Bu DTD’yi kullanan XML belgesi de şöyle olsun :

<?XML version=”1.0”?>
<!DOCTYPE kutlama SYSTEM “kutlama.dtd”>
<tebrik>
<kime> Mehmet </kime>
<ileti> Doğum Günün Kutlu Olsun </ileti>
</tebrik>

Bu örnekte, <tebrik> elemanı, XML belgesinde bulunmasına rağmen, DTD içinde


tanımlı değil. Bu bize XML işleyicisinden hata gelmesine yol açar. Diğer hata ise, DTD içinde
tanımanmış <kimden> elemanı, XML belgesinde kullanılmamış. Bu da bir başka hatadır.

DTD’ler, XML belgelerine modülerlik katar. Örneğin elimizde çok büyük bir XML
kütüğü olduğunu farzedelim. Eğer DTD olmazsa bu belgeye göz atmak çok zor ve sıkıcı
olabilir. Bu şekilde, belgenin anlamıyla ilgisiz, uzun metinler içerisinde belgenin genel yapısı
hakkında fikir edinmekle uğraşılır. Bunun yerine iyi hazırlanmış bir DTD’yi kısa bir süre
inceleyerek çok daha etkin bir görüşe sahip olabiliriz. Sonuç olarak bir DTD, ele alınan XML
belgesi hakkında bize açık ve hızlı bir resim çizer.

Ayrıca, hazırlanan XML belgelerinin amacı hakkında da kesin bir fikir sahibi
olabilmek için DTD’ler yararlı olacaktır.

XML’in yazılış amacını öğrenmek ve içeriğini anlamak önemlidir. Bunun için,


XML belgesiyle DTD’sinin uyumlu olması gerekir. İşte bu uyumu denetlenmek amacıyla
“parser” adı verilen araçlar kullanılır.

4.2. Bir DTD Yaratmak

Bir DTD oluşturmak için öncelikle XML’in temel özelliklerini bilmeliyiz. Bir
DOCTYPE bildirimi, DTD ile XML belgesini birbirine bağlar. DOCTYPE bildirisi XML
belgesinin girişine yazılır ve herhangi bir elemandan önce gelir. Bu bildiriden önce XML
bildirisi yer alır. Bundan başka işleyici komutları, yorum satırları da olabilir.
.
Diyelim ki genel bir kutlama mesajını, XML kullanarak geliştirmek istiyoruz. Hangi
yapıları tanımlamaya ihtiyacımız var? İçinde <ileti> ve <kime> elemanlarını bulunduran
<kutlama> elemanına ihtiyacımız var. Tanımladığımız <kime> elemanı ilk çocuk olmalıdır
ve <ileti> elementi onu izlemelidir. Bu iki elementin babası <kutlama> olmalıdır. <ileti> ve
<kime>, başka elementler barındırmamalı ve sadece metin (karakter) bilgisi içerebilir.
Karakter bilgisi, XML işlemcisi tarafından parse edileceği için, Parsed Character DATA
anlamına gelen PCDATA sözcüğüyle ifade edilir.
DTD’demizi iç DTD olarak tanımlarsak şu kodu yazmalıyız:

<!DOCTYPE kutlama[
<!ELEMENT kutlama(kime,ileti)>
<!ELEMENT kime (#PCDATA)>
<!ELEMENT ileti (#PCDATA)>
]>

Şimdi bu DTD’yi satır satır inceleyelim.

<!DOCTYPE kutlama [
Bu satırda <kutlama> adında bir kök elementi bulunan DOCTYPE bildirisi yapılıyor.
Köşeli sol parantez ([) , bir iç DTD alt kümesinin başladığını gösterir. Eğer bir dış DTD de
bulunsaydı, bu paramtezden önce dış DTD referansı yer alacaktı.

<!ELEMENT kutlama (kime,ileti)>


Bu satır ise <kutlama> elementinin, bir <kime> elementi ve bir de <ileti> elementi
içerdiğini, bunlardan sadece birer tane olabilceğini ve <kime> elementinin <ileti>
elementinde önce gelmesi gerektiğini anlatıyor.

Şimdi sözdizime biraz daha yakından bakalım :

Parantezler <kutlama> elementinin izin verilen içeriğini tutar. Element isimleri


arasındaki “virgül” <kime> ‘nin <ileti> ‘den önce gelmesi gerektiğini anlatır.

<!ELEMENT kime (#PCDATA)>


<!ELEMENT ileti (#PCDATA)>
Bu satırlar bize <kime> ve <ileti> elementlerinin her birinin “parsed character” verisi
tuttuğunu fakat herhangi bir çocuk element içermediğini belirtir.

“]>” satırı, DOCTYPE bildirisinin iç alt kümesinin tamamlandığını belirtir.

Uygulamada iç DTD’ler pek kullanılmaz. XML belgesine eklenen her DTD saklama
ihtiyaçları doğurur. Çok sayıdaki XML belgelerinin temel aldığı bir dış DTD’nin bakımı
bütün XML belgelerindeki iç DTD’lerin bakımından daha kolaydır. Dikkat edilecek olursa, iç
DTD’deki <!ELEMENT ‘le başlayan satırlar , XML belgesi içinde bir eleman bildirimi
yapacağımızı belirtmektir.

Daha geniş bir örnekle yolumuza devam edelim :

<?xml version=’1.0’?>
<!DOCTYPE kitap SYSTEM “kitapyapisi.dtd”>
<kitap>
<isim> Malatya ve Bursa Yöresi Yemek Tarifleri</isim>
<yazarlar>
<yazar> Tolga Ovatman </yazar>
<yazar> Mehmet Gürsul </yazar>
<yazar> Levent Tanın </yazar>
</yazarlar>
<onsoz>
</onsoz>
<yayınevi>
<!—Yayınevi hakkında ayrıntılar buraya yazılır-->
</yayınevi>
<isbn>
<!-- ISBN numarası buraya yazılır -->
</isbn>
<bolumler>
<!--baslangıc bolumleri -->
<bolum>
<bno>9
</bno>
<badi> Malatya Etli Yemekleri
</badi>
<!--Diğer konu adları -->
<konu> Malatya İçli Köftesi
</konu>
<!--Başka konu adları -->
</bolum>
<!--Sonraki bölümler -->
</bolumler>
<ekler>
<!—Diğer ekler -->
<ek> Lavaş yapımı </ek>
</ekler>
<dizin>
<!—Buraya dizin yazılabilir -->
</dizin>
</kitap>

<kitap> elementinin , element bildirimi şu şekildedir :

<!ELEMENT kitap (isim,yazarlar*,onsoz?,yayınevi,isbn?,


bolumler+,ekler*,dizin?)>

isim yerine geçebilecek herhangi bir sembol ne eksik ne fazla sadece bir kez
görünmeli , <title> elementinin bildirimi şu şekildedir :

<!ELEMENT title (#PCDATA)>

Şimdi bir bolum’ü nasıl tanımladığımıza bakalım:

Her bölüm’ün sadece bir numarası ve bir başlığı olması gerekir. Bunula beraber
konu’ların sayısı birden fazla olabilir. Böylece konu elementinin şöyle tanımlayabiliriz:

<!ELEMENT bolum (bno,badi,konu+)>

Bu tanımla, bno ve badi elemanı yalnızca bir kez geçmesi gerekirken , konu elemanı
birden çok kez görünebilir.
Sırada <yazarlar> elemanı var. Her kitabın bir yazarı vardır. Fakat bazı kitapların
birden çok yazarı da olabilir. Birden çok yazar olması ihtimalini ve hiç yazar olmaması
ihtimalini göz önünde bulundurmak için aşağıdaki tanım yapılır:

<!ELEMENT yazarlar(yazar*)>

Anlaşıldığı üzere, bildiri <yazarlar> elemanını tanımlıyor ve bu elemanın <yazar>


adlı hiç veya pekçok özelliğe sahip olabilecek bir çocuk elemanına sahip olduğunu *
kullanarak tanımlıyor.

Sıradaki eleman <onsoz>, dikkat edecek olursak bu elemanın sonunda bir “?”
olduğunu görürüz. Nesnenin gerçekteki özelliklerine bakılırsa, bir kitabın bir önsöz bölümü
olur ya da olmaz. Veya biz bunu veri tabanımıza katmak isteriz ya da istemeyiz. Bu durumda
elemanın belge içinde bulunma sayısı 0 veya 1 olabilir. İşte başta söz ettiğimiz “?” nesnenin
bu özelliğini belirlemeye yarar.

Yaptığımız açıklamalar sonucunda verdiğimiz XML belgesinin “kitapyapisi.dtd”


isimli dış DTD’si şu şekilde görülecektir :

<!ELEMENT kitap (isim,yazarlar*,onsoz?,yayınevi,isbn?,


bolumler+,ekler*,dizin?)>
<!ELEMENT isim (#PCDATA)>
<!ELEMENT yazarlar (yazar*)>
<!ELEMENT yazar (#PCDATA)>
<!ELEMENT onsoz (#PCDATA)>
<!ELEMENT yayınevi (#PCDATA)>
<!ELEMENT isbn (#PCDATA)>
<!ELEMENT bolumler (bolum+)>
<!ELEMENT bolum (bno,badi,konu+)>
<!ELEMENT bno (#PCDATA)>
<!ELEMENT badi (#PCDATA)>
<!ELEMENT konu (#PCDATA)>
<!ELEMENT ekler (ek*)>
<!ELEMENT ek (#PCDATA)>
<!ELEMENT dizin (#PCDATA)>

Bu örneklerde gördüğümüz PCDATA, XML işleyicisi tarafından “parse” edilen


karakter verilerdir. “XML parser”ı tarafından hiç bir “parse” işleminin yapılmadığı CDATA
gibi bölümlerde (section) bulunur.
PCDATA verisinin yetersiz kaldığı yön ise, hiç bir zaman tür kontrolünün
yapılamamasıdır. Bu belge tabanlı XML ile ilgilendiğimizde büyük bir eksikliktir.

Şimdiye kadar DTD’lerin eleman tanımladığı örneklere baktık. Bunun dışında


DTD’de bir eleman için atanabilir özellikleri de tanımlayabiliriz. Şu XML örneğinin ele
alalım:

<?xml version=’1.0’?>
<belgeciktisi>
<kagitrengi renk=”beyaz”> Yükses kalite harika kuşe kağıt
</kagitrengi>
<murkrengi renk=”siyah”> Süper kalite şahane mürekkep
</murkrengi>
</belgeciktisi>

Burada , <kagitrengi> ve <murkrengi> elemanları mevcuttur ve her birinin renk


özelliği vardır. Eğer sadece siyah-beyaz kağıt ve siyah-beyaz mürekkep kullancağımız
gözönüne alınırsa özellik bildirimimiz şu şekilde olacaktır :

<!ELEMENT belgeciktisi (kagitrengi,murkrengi)>


<!ELEMENT kagitrengi (#PCDATA)>
<!ATTLIST kagitrengi renk (siyah|beyaz) #REQUIRED>
<!ELEMENT murkrengi (#PCDATA)>
<!ATTLIST murkrengi renk (siyah|beyaz) #REQUIRED>

Söz dizimden de görüldüğü gibi, renk özelliği siyah-beyaz değerlerinden birini


almak zorundadır(#REQUIRED).

DTD Yapıları :

Şimdiye kadar sadece ELEMENT ve ATTLIST bildirirmlerine göz attık. Bu bölümde


de mümkün olan bütün geçerli bildirimleri kısaca tanımlayacağız :

DTD Yapısı İşlevi


ELEMENT XML eleman tipi bildirimi.
ATTLIST Belirli bir ELEMENT tipine bağlanabilecek özelliklerin ve bu özelliklerin
alabileceği değerlerin bildirimi.
ENTITY Yeniden kullanılabilir içerik bildirimi
NOTATION “Parse” edilmeyecek dış içeriğin (örneğin ikil ya da resim kütükleri)
biçiminin bildirimi.

4.3. Özellikler(Attributes) İle Çalışmak

Şimdi bir DTD içinde özellik tanımlarken kullanabileceğimiz yapıları da gözden


geçirelim. Özellikler, özellik bildirim listesi(attribute declaration list) denilen bir liste içinde
aşağıda belirtilen şekilde tanımlanır:

<!ATTLIST ElementName AttrName AttrType Default>

Görüleceği gibi bir özellik; isim(AttrName), tip(AttrType) ve öndeğer(default) olmak


üzere üç bileşenden oluşmaktadır.Bir özellik bildirimi sırasında kullanılabilecek olan dört
öndeğeri vardır:

• #REQUIRED
• #IMPLIED
• #FIXED
• default

#REQUIRED değeri özelliğin eleman için mutlaka gerekli olduğunu belirtir.


#IMPLIED değeri özelliğin seçimsel olduğunu ve eleman için kullanımının zorunlu
olmadığını belirtir. #FIXED değeri özelliğe atanacak değerin sabit olacağını ve bunun da
özelliği, bir bilginin sabit bir parçası durumuna getireceğini belirtir.
XML 10 tane farklı özellik tipini desteklemektedir:

• CDATA :Parse edilmemiş karakter verisi


• Enumerated :Bir dizi değer
• NOTATION :DTD içinde herhangi bir yerde tanımlanmış olan notasyon
• ENTITY: Dışsal bir binary entity
• ENTITIES Birden fazla dışsal binary entity ler
• ID : Biricik bir tanımlayıcı
• IDREF: DTD içinde tanımlanmış olan bir ID ye referans edilen değer
• IDREFS: DTD içinde birden fazla ID lere refere edilen değerler
• NMTOKEN: XML token değerlerini içeren isim
• NMTOKENS:XML tone karakterlerini içeren isim boşlukları

“String Attribute”ları

“String attribute”lar CDATA tarafından gösterilen ve en çok kullanılan özellik tipidir.


CDATA tipi özelliklerin bir metin “string”ini içereceğini belirtir.Aşağıdaki örnekte CDATA
tipi ile beraber oyuncu elementinin kullanılışı gösterilmiştir:

<!ATTLIST oyuncu takim CDATA #REQUIRED>

Bu örnekte oyuncu‘nun ait olduğu takim, oyuncu elemanının bir özelliğidir.Bu özellik,
oyuncu elemanı için gerekli olan bir karakter verisi tipinde olmalıdır. Bu takim özelliğini
seçimsel hale getirmek isteseydik:

<!ATTLIST oyuncu takim CDATA #IMPLIED> şeklinde kullanmamız gerekirdi.

“Enumerated Attribute”lar

Bu tür özellikler daha önceden tanımlanmış bir metin dizisinin listesini içerirler.
“Enumerated” tipi CDATA tipine benzemektedir ancak bu veri tipinde kabul edilebilir özellik
değerleri, özellik listesi bildirimi içinde sağlanmaktadır.Şimdi, oyuncu elemanına
“enumerated” bir özellik değeri olan pozisyon bilgisini de ekleyelim:

<!ATLIST oyuncu pozisyon (ortasaha | forvet | savunma | kaleci)


"ortasaha">

Bu örnekte pozisyon değerinden birini seçebilmekteyiz. Eğer hiçbir şey seçmezsek


“default” değer olan “ortasaha” devreye girer.

4.4. XML Ayrıştırma (XML Parsing)

Bir XML belgesi bir bakımdan da yalın bir metin belgesi olarak görülebilir. Tam
olarak bir XML kütüğü arka arkaya sıralanmış gerçek bir anlamı olmayan karakterler dizisidir
(tabii bir bilgisayar onları yorumlamadığı sürece!). Bir metin düzenleyici, XML kütüğü
yaratabilir ama onu bir dizi karakter olarak görür. Sıradan bir metin düzenleyici, XML belgesi
içindeki sıralı karakterlerin içinde barındırdığı mantıksal yapı hakkında hiçbir şey bilmez.
XML iki bilgisayar arasındaki iletişimde kullanıldığı için, XML belgesinin mantıksal
içeriğine ya da “anlamına” erişmek önemlidir. Bu nedenle XML belgesi, bir dizi karakterden
mantıksal bir yapıya çevrilmelidir.

Bir XML parser’ı ya da işleyicisi, mantıksal yapıya dönüştürme işlemini


gerçekleştirebilir. XML’in amacı bilgisayardan bilgisayara iletişime yardım etmek olduğu
için, bir XML parser’ı diğer bir yazılımın ya da bilgisayarın daha sonra işleyebileceği bir çıktı
üretir.

Biraz daha değişik bir açıdan bu düşünce şu şekilde ele alınabilir. Bir XML belgesini
parse etmenin amacı diğer uygulamaların, XML belgesinin mantıksal yapısının içeriğine
erişip inceleme yapabilecekleri arayüzler üretmektir.

Bu üretim sırasında uyulacak bazı kurallar vardır. Örneğin bir “validating parser” bir
XML belgesinin hem valid hem de well-formed olduğunu sınamalıdır. Fakat bir “non-
validating parser” sadece belgenin well-formed olup olmadığını sınar.

Şimdi de bir uygulamanın XML işleyicisinden elde ettiği çıktıyı nasıl ele alabileceğine
bakalım. Bir programdan, XML belgesi okumanın dört yolu vardır. Bunlardan birincisi bir
bilgisayar yazılımı üretmemiz ve kendi arayüzümüzü yaratmamız. Fakat genelde, daha çok
kabul gören SAX(the Simple API for XML) ve DOM(the Document Object Model) isimli
test edilmiş arayüzler kullanılır. 4. yol ise bir API’ye sahip XML Parser’ını kullanmak.

Temelde iki çeşit XML API’si (Application Programming Interface) bulunur: ağaç-
tabanlı ve olay-güdümlü (tree-based/event-driven). Ağaç tabanlı API’ler XML belgesini bir
ağaç yapısına dönüştürür ve bir uygulamanın bu ağacı dolaşmasını sağlar. DOM isimli API bu
tür API’lere bir örnektir.

API kullanan uygulama, veri-merkezli değil de belge-merkezli çalışacaksa yani


uygulama belge içindeki veriler yerine belgenin kendisiyle olan işlemlere daha çok ağırlık
veriyorsa ağaç-tabanlı API’ler çok daha kullanışlıdır. Bununla beraber ağaç kullanmak sistem
kaynaklarınızda ağır bir yük yaratabilir. Eğer belgenin tamamı yerine bir kısmı ile
ilgileniyorsak bu kötü bir özellik olacaktır. Bir başka olasılık ise ağaç tabanlı temsilin
sorunumuza tam uymamasıdır. Küçük bir işlem için API’nin oluşturduğu ağaç yapısına
uyumlu uygulamalar geliştirmek zaman ve uğraş ister.

Diğer taraftan “Event-driven” API’ler parse edilme esnasındaki olayları (eleman


başlangıç ve bitişi gibi) doğrudan uygulama programına aktarır. Böylece ağaç yapısına gerek
kalmaz. Uygulama programı, değişik olaylarlı(event) ele alabilmek için “handler” lar
geliştirir. SAX bu tür API’ler arasında en çok bilinenidir.

4.4.1. SAX (Simple API for XML)

SAX, W3C tabanlı olmayan pek az XML tabanlı standartlardan biridir. XML-DEV
mailing List’deki tartışmalarda ortaya çıkmıştır. SAX , DOM gibi ağaç tabanlı API’lere göre ,
XML belgesine daha basit ve daha alt düzeyli bir erişim sağlar. Hafızaya sığmayan çok büyük
belgeleri parse etmek SAX ile mümkündür.

SAX şu şekilde çalışır:


Bir “XML Parser”ı XML belgesini taradığında SAX, herbir etiket ile bir olay
ilişkilendirir. Bu olay’ın farkedilmesi uygulamya bırakılır. Sonra da uygulamamız amacına
göre her bir olay’ı ele alır. Kullanıcılar, SAX’ın ürettiği olaylar için “event handler”lar
yazabilir. Gerekli işlemleri yapmak ve olayların , XML belgesi ile tutarlı olduğunu sınamak,
olayı ele alan uygulamaya bırakılmıştır. Bu işlem için bütün belgeyi hafızada tutmaya gerek
yoktur.

SAX’ın nasıl çalıştığını daha iyi anlamak için şu küçük XML belgesini inceleyelim:

<?xml version="1.0"?>
<belge>
<para>Basit bir örnek</para>
</belge>

SAX kullanan bir “parser” belgeyi şu şekilde bir dizi olay haline getirir:

startDocument
startElement: belge
startElement: para
characters: Basit bir örnek
endElement: para
endElement: belge
endDocument

SAX’a istemci konumunda olan bir uygulama bu olayları ele alır ve istenilen faaliyetleri
yerine getirir. Bütün belgenin hafızaya alınmasına böylece gerek kalmaz ve belgenin içinde
ilgilenmediğimiz herhangi bir bölümü yazacağımız uygulama ile ele almak zorunda kalmayız.

4.4.2. DOM (Document Object Model)

DOM, W3C tabanlı bir modeldir. Bu model ile XML belgesi düğümlerden oluşan bir
ağaca dönüştürülür ve bu ağaç bilgisayar hafızasına alır. Bütün belge, hafızada bir kerede
tutulmak zorundadır. Bu nedenle, çok büyük XML belgelerini DOM tabanlı yaklaşımla ele
almak, hafıza yetersizlikleri nedeniyle kısıtlamalar getirebilir. Ayrıca DOM’u çok büyük
belgelerde kullanmak, yavaş bir işlemdir.

DOM, XML ağaç yapısına ulaşımı kolaylaştırmak için bir dizi arayüzler (inerface)
içerir. Bu arayüzler de düğüm tipine göre değişen metod ve özellikler içerir. DOM'un temel
arayüzü düğümdür. Herhangi bir düğüm ise eleman, özellik veya metin olabilir. Düğüm
arayüzü bütün düğüm tipleri için ortak olan metod ve özellikler içerir. Diğer DOM arayüzleri
ise düğümden türetilmişlerdir.

Şimdi, örnek bir xml belgesi üzerinde istenen bir düğüme a nasıl ulaşıldığına bakalım.
Burada ulaşılmak istenen bilgi, pembe renkle gösterilen "Prescod" değeri.
Bu yapının, XML belgesi aşağıdaki gibidir:
<?xml version="1.0"?>
<kitaplar>
<kitap>
<baslik>The XML Handbook</baslik>
<yazar>Goldfarb</yazar>
<yazar>Prescod</yazar>
<kitabevi>Prentice Hall</kitabevi>
<sayfa>688</sayfa>
<isbn>1-3081-1521-0</isbn>
<fiyat currency="DM">44.95</fiyat>
</kitap>
<kitap>
<baslik>XML Design</baslik>
<yazar>Spencer</yazar>
<kitabevi>Wrox Press</kitabevi>
<sayfa>426</sayfa>
<isbn>1-861002-28-9</isbn>
<fiyat currency="USD">39.99</fiyat>
</kitap>
</kitaplar>
Aşağıdaki HTML sayfası ise bu veriyi işleyen Java Script kodu içeriyor ve MS Internet
Explorer 5.x tarayıcı ile çalıştırılabilir. Yani XML işlenmesi (parsing) istemci (client) tarafında
gerçekleşiyor. Bu kod parçası XML işleyicisi olarak "Microsoft.XMLDOM" kullanıyor.
<HTML>
<HEAD><TITLE>DOM Örneği</TITLE></HEAD>
<BODY>
<H1>DOM Example</H1>
<SCRIPT LANGUAGE="JavaScript">
var doc, kok, kitap1, yazarlar, yazar2;
doc = new ActiveXObject("Microsoft.XMLDOM");
doc.async = false;
doc.load("kitaplar.xml");
if (doc.parseError != 0)
alert(doc.parseError.reason);
else {
kok = doc.documentElement;
document.write("Kok node un adı: " + kok.nodeName +
"<BR>");
document.write("Kok node un tipi: " + kok.nodeType +
"<BR>");
kitap1 = kok.childNodes.item(0);
yazarlar = kitap1.getElementsByTagName("yazar");
document.write("Yazarların adedi: " +
yazarlar.length + "<BR>");
yazar2 = yazarlar.item(1);
document.write("İkinci yazarın adı : " +
yazar2.childNodes.item(0).data);
}
</SCRIPT>
</BODY>
</HTML>

4.4.3. XPath

W3C tanımına göre XPath: XML belgesinin ağaç yapısı içerisindeki elemanların
adreslenmesi için geliştirilmiş bir dildir. XSLT ve XPointer tarafından da kullanılır. XPath,
XML belgelerindeki elemanlar, özellikler ve diğer XML düğümlerinin adreslenmesi için basit
ve standart bir yapı sağlar. XPath standardı, üç diğer W3C standardının içinde yeralmaktadır:
Bunlardan birincisi XSLT, ikincisi XLink ve bunun içinde yer alan XPointer, ve üçüncüsü ilk
XML sorgulama dillerinden biri olan XQL'dir.

XPath’in, bir belge içindeki elemanlarının dizilişini gösteren şablonları sağlamak


amacıyla da bir sözdizimi bulunur. Önemli noktalardan biri de şudur ki XPath XML
sözdizimini kullanmaz. XPath’in tanımında XML sözdiziminin kullanılmamasının getirdiği
yararlardan biri de XPath’in URI’ler ve XML özellik değerleri içinde kullanılabilmesidir.

XPath XML’deki “namespaces” leri destekler. Çünkü XPath, XML belgesini


düğümlerden oluşan bir ağaç olarak görür. Bir düğümün adı yerel bölüm ve “namespace” den
oluşur. İkisi birlikte geniş ismi (“expanded name”) oluşturur.
XPath sözdizimini oluşturan temel yapı, deyimleridir. XPath deyimleri, nesneleri işler
ve sonuçta; “node-set” (birkaç düğümün birleşimi) , “boolean” (mantıksal) , “number” (sayı)
veya “string” (dizi) türlerinden biri şeklinde sonuç üretir.

XPath’e göre, XML belgesinin ağacının düğümleri 7 türde olabilir. Bunlar :

• Kök düğümler (root nodes) : Ağacın kök düğümü.


• Eleman düğümleri (element nodes) : Belgedeki her eleman için oluşturulan düğümler.
• Metin düğümleri (text nodes) : Karakter bilgileri metin düğümleri içerisine
gruplandırılmışlardır.
• Özellik düğümleri (attribute nodes): Her eleman düğümünün sahip olduğu özelliklerin
her biri için bir çocuk bulunur.
• Namespace nodes: Her eleman, bir küme namespace düğümü ile ilişkilendirilir.
• İşlem komutları düğümleri (processing instruction nodes) : DTD (decleration) içinde
yer alanlar hariç her işlem komutu bir düğümde bulunur.
• Yorum düğümleri (comment nodes): DTD (decleration) haricinden her yorum satırı bir
düğümde yer alır.

XPath'deki adresleme mekanizmasının kalbi, "location path" dir. "Location path"ler


ulaşılmak istenen yerin bulunulan noktaya (context node) göre yerini belirler.

XPath'in tanımında da görülebileceği gibi XPath'de 13 adet axis (eksen) bulunur:

child axis: Bulunulan düğümün çocuk düğümü. Bir düğüm için varsayılan (default) axis
budur.
descendant axis: Bulunulan düğümün çocuğu veya çocuğunun çocuğu veya bu şekilde
herhangi bir seviye altındaki alt düğüm.
parent axis: Bulunulan düğümün bir seviye üstteki düğümü. ".." ile ifade edilir.
ancestor axis: Bulunulan düğümün atası veya herhangibir seviye üstündeki düğümü
following-sibling axis: Bulunulan düğümün devamındaki kardeş (aynı seviyede) düğümler
preceding-sibling axis: Bulunulan düğümden önce gelen kardeş düğümler
following axis: Belgedeki sıraya göre bulunulan düğümden sonra yer alan, alt düğümleri hariç
bütün düğümler
preceding axis: Belgedeki sıraya göre bulunulan düğümden sonra yeralan, ataları hariç bütün
düğümler
attribute axis: Bulunulan düğümün özellikleri. "@" öneki ile tarif edilir.
namespace axis:bulunulan düğümün namespace düğümleri
self axis: bulunulan düğümün kendisi. "." ile ifade edilir.
descendant-or-self axis: bulunulan düğümün kendisi ve ata (descendant) düğümleri. "//" ile
ifade edilir.
ancestor-or-self axis: bulunulan düğümün kendisi ve alt (ancestor) düğümleri

XPath sözdizimine birkaç örnek verelim. Burada para ifadesiyle parametre


elemandan söz ediyoruz.

• child::para : Bulunulan elemanın para çocuğunu seçer.


• child::* : Bulunulan düğümün bütün çocuklarını seçer.
• child::text() : Bulunulan düğümün çocukları arasından metin düğümlerini seçer.
• child::node() : Bulunulan düğümün hangi türde olursa olsun bütün çocuklarını seçer.
• child::bolum/descendant::para : Bulunulan düğümün bolum elemanı çocuğunun
soyundaki bütün para elemanlarını seçer.
• child::*/child::para : Bulunulan düğümün bütün torunları arasından para düğümünü
seçer.
• attribute::name : Bulunulan düğümün name özelliğini seçer.
• Attribute::* : Bulunulan düğümün bütün özelliklerini seçer.
• / : Belge kökünü seçer. (Bu bütün elemanların atasıdır)
• /descendant::para : Bulunulan düğümle aynı belgede yer alan bütün para
düğümlerini seçer.
• child::para[position()=1] : Bulunulan düğümün ilk para çocuğunu seçer.
• child::para[position()=last()] : Bulunulan düğümün son para çocuğunu seçer.
• child::para[position()=last()-1] : Bulunulan düğümün sondan bir önceki para
çocuğunu seçer.
• child::para[position()>1] : Bulunulan düğümün ilk para çocuğunun haricindeki
para çocuklarını seçer.

4.4.4. XPointer

XPointer’ın amacı, herhangi bir URI(Uniform Resource Identifier) referansı için,


XML belgesinin içinde kesimler yaratmaktır. Başka bir deyişle, XPointer, XML belgesinin iç
yapısını ve bu belgelerin içindeki XML kesimlerinin yerlerini adreslemeyi destekler. Diğer bir
deyişle, XPointer sıradüzensel bir belgenin yapısının sınanmasına izin verir.

XPointer, XPath üzerine kurulmuştur ve XPath’ın ifadelerini kullanır, ayrıca XPath’ın


içindeki bazı ifadelerin genişlemesini sağlar. Bu genişlemeler XPath’in şunları yapmasına
yardımcı olur:
• Düğümlerin yanında XML belgesi içinde herhangi bir noktanın ya da herhangi iki
nokta arasının da adreslenmesini sağlar
• Dizi eşlemesi yaparın bilgilerin yerini belirler.
• URI referanslarındaki adresleme deyimlerini kullanmaya olanak sağlar.

XPointer kullanarak bir nesnenin yerini belirlediğimzde bunu bağlama (link) için bir
taban olarak kullanabiliriz.

Birkaç küçük örnek ile XPointer’ın nasıl çalıştığına bir göz atalım. İlk olarak şu XML
belgesini ele alalım:

<!DOCTYPE konusma [
<!ELEMENT konusma (#PCDATA|konusan|yon)*>
<!ATTLIST konusma
ID ID #IMPLIED>
<!ELEMENT konusan (#PCDATA)>
<!ELEMENT yon (#PCDATA)>
]>
<konusma ID="a27">
<konusan>Tolga</konusan>
<yon> pencereden dışarı</yon>
Acele et , ders başlıyor
<yon>Levent’e</yon>
Mehmet birazdan sınıfta olur
</konusma>
Bazı XPointer deyimleriyle bu belgeden kaynaklar seçelim:

id(a27).child(2,yon)
İkinci “yon” elemanını seçer (içeriği “Levent’e” olanı).

id(a27).child(2,#element)
İkinci çocuk elemanı seçer (bu ilk “yon” , içeriği “pencereden dışarı” olan).

id(a27).child(2,#text)
İkinci metin bölümünü seçer , "Mehmet birazdan sınıfta olur" (“Acele et ders
başlıyor” ilk bölgeydi)

Gördüğümüz üzere #element ve #text yardımıyla içeriğini tam olarak bilmediğimiz


bölümleri de seçtik. Bu değerler sırasıyla şunlardır ve şu anlama gelirler:

#element
XML elemanlarını seçmekte kullanılır.
#pi
XML işleyici komutlarını seçmekte kullanılır.
#comment
XML açıklama satırlarını seçmekte kullanılır.
#text
elemanlar arasındaki ve CDATA bölümlerindeki metin alanlarını seçmekte kullanılır.
#cdata
CDATA bölümleri içerisinde bulunan metin alanlarını seçmekte kullanılır.
#all
Yukarıdaki düğüm türlerinden hepsi için kullanılır.

XPointer kullanarak, düğümler özelliklerine göre de seçilebilir. Örneğin alttaki terim


kaynağın , HEDEF özelliğine sahip ilk çocuğunu seçer.

child(1,#element,TARGET,*)

Bu örnekte is bir çocuk elemanı N özelliği kullanılarak seçiliyor:

child(1,#element,N,2).(1,#element,N,1)

Kaynağın başından başlayarak eleman tipi ne olursa olsun N isimli özelliği “2” değerine
sahip ilk çocuk seçiliyor. Daha sonra bu elemanın N isimli özellik değeri “1” olan ilk çocuğu
seçiliyor.

Örneklerden de gördüğümüz gibi XPointer XPath’e çok benziyor fakat çok daha
gelişmiş seçme özelliklerine sahip.

4.4.5. Xlink

XPath ve XPointer’dan farklı olarak, Xlink’in sözdizimi XML’e bağımlıdır.


Xlink, hem temel bağlar; hem de daha karmaşık bağ yapıları için temel bir yapı
oluşturur. Daha karışık bağ işlevlerinden hareketle, Xlink, internet bağları(hyperlink) de
sağlar. W3C’ye göre, XLink, XPointer ile koşut kullanılmalıdır.

XLink , XML belgelerine , kaynaklar arası bağları tanımlayan ve yaratan elementler


yerleştirmeye izin verir. HTML’deki <a> etiketi gibi bağlar yanında XLink daha karmaşık
bağlama işlevlerini de gerçekleştirir. XLink, kaynaklar arasındaki net ilişkidir. Bir kaynak
(resimler, kütükler, programlar, belgeler ve sorgu sonuçları) ise bir bilginin ya da servisin
herhangi bir adreslenebilir bileşenidir.

Özetle XLink , XML dökümanlarına şunları yapmamızı sağlar:

• İkiden fazla kaynak arasında bağ kurmamızı,


• Meta-veriyi bağlarla birleştirmemizi,
• Bağlanmış kaynaklardan farklı yerlerdeki bağları ifade etmemizi sağlar.

4.4.6. “XML Parser” ları (XML Ayrıştırıcıları)

Bir XML Parser’ı (XML işleyicisi olarak da bilinir), XML belgesinin söz dizimini ve
mantıksal içeriğini denetler. Bütün ayrıştırıcı XML belgesinin iyi-oluşturulmuş (well-formed)
olup olmadığını kontrol eder Ek olarak, geçerleyici ayrıştırıcılar belgenin uygun DTD ile
eşleşip eşleşmediğini doğrular.

Teknik açıdan bakıldığında XML Parser’ı yazmak göreli olarak daha kolaydır. Bu
yüzden de artan sayıda parser’lar piyasada mevcuttur. Büyük ihtimalle kullanıcılar doğrudan
bir XML Parser’ını kullanmaya ihtiyaç duymayacaklardır. Bunun nedeni genellikle XML
Parser’lara erişim sağlayan bileşik bir aracın kullanılmasıdır. Örneğin XML Writer programı
arka planda Microsoft MSXML Parser’ını kullanır.

Öyleyse bir Parser ne yapar? Bir takım karakterden nasıl mantıksal sonuçlar çıkarır.
Aslında bir XML Parser’ı XML metin kütüğünü sıradüzensel bir şekilde tarar. XML
belgesinin elementleri gibi bölümleri belirler. Eğer Parser geçerleyici ise, XML belgesinde
kullanılabilecek yapıyı belirlemek için, DTD üzerinde basit bir işlem yürütür. Daha sonra
Parser, XML belgesinin yapısı ile DTD’ye uygunluk sağlayan yapıyı karşılaştırır. Bu işlem
sonucunda da geçerlilik kontrol edilmiş olur.

Çok sayıda XML ayrıştırıcısı ücretsiz olarak kullanılabilir. Bunların çoğu hem DOM
hem SAX modelini destekler. Bazıları şunlardır:

• Project X (Sun Microsystems)


• Ælfred (Microstar Software)
• XML4J (IBM) Project X
• Lark (Tim Bray)
• MSXML (Microsoft)
• XJ (Data Channel)
• Xerces (Apache)
4.5. XML Şema (XML Schema)

XML schema tıpkı DTD lerde olduğu gibi belge içindeki elementlerin ve içerik
modellerinin tanımlanması işlemini ve dolayısıyla belgenin geçerlenmesini sağlar. Ancak
XML schemalar elemanların bu tanım işleminde zengin bir veri tipi çeşitliliği ve özellik
desteği sağlamaktadır.

DTD içerisinde, eleman içeriği string ve diğer birkaç veri tipi ile sınırlıdır. XML
schema çok geniş bir veri tipi desteği sağlamaktadır (integer,floating point sayılar,date,time,
gibi). XML schema ayrıca açık içerik modeli(open content model) ve isim uzayı(namespace
integration) gibi ek özellikler de sunmaktadır. XML schema belgeleri oluşturulması sırasında
XML sözdizimi kullanılmaktadır. Bu DTD lere göre çok belirgin bir üstünlüktür çünkü yeni
bir sözdizim öğrenmemiz yerine XML’in XML schemaya özel komutlarını öğrenmek yeterli
olur.

Aşağıda XML schemanın DTD ye göre olan yararları liste halinde verilmiştir:

• XML schemalar XML sözdizimini temel olarak alır.Özel bir sözdizimi gerektirmez
• Diğer XML belgeleri gibi parse edilip üzerinde işlem yapılabilir
• Çok geniş bir veri tipi desteği sağlar
• Open-ended bir veri modeli sunar.Bu model sayesinde elemanlar arasındaki ilişkilerin
kurulması ve vocabulary haznesinin genişletilmesi sağlanır
• Namespace desteği sağlar.Bu özellik schema içerisindeki bildirimler için ayrı node’ları
birleştirmeye yarar.
• Özellik gruplarını destekler. Böylece özellikler mantıksal olarak gruplanabilir.

4.5.1. XML Şema’nın içyapısı

XML schema’nın kendisi de bir XML uygulamasıdır, yani kendisi de bir XML
“vocabulary” olarak değerlendirilebilir. XML schema kullanarak schemaların oluşturulması
tıpkı diğer XML belgelerinin oluşturulmasına benzer.

Bu sınırlamalara rağmen XML schema vocabulary yapısının anlaşılabilmesi XML


schema DTD yi incelemekte yarar vardır. Bunun için Schema Element ve Elementtype
Element kavramları örneklerle anlatılacaktır.

Schema Element
Schema elementi XML Schema belgeleri için kök eleman olarak hizmet verir ve diğer
schema içeriğine taşıyıcılık yapar. Schema elementi iki tane özelliğe sahiptir:

• name
• xmlns

name özelliği schema için bir isim belirtilmesine yarar.xmlns özelliğinin ise son
derece önemli bir görevi vardır. Schema için bir namespace oluşturulmasına yarar. Bu özellik
örneğin Microsoft’un schema belirtimlerini kullanabilmesi için “urn:schemas-microsoft-
com:xml-data” değerine set edilmesi gerekir .Aşağıdaki örnekte XML schema belgesi için
name ve xmlns attribute’larının nasıl kullanılacağı basitçe gösterilmiştir.

<Schema name="MySchema" xmlns= urn:schemas-microsoft-com:xml-data">


<! - -Schema içerği buraya yazılır- ->
</Schema>

“namespace”ler XML belgesinde görev alan eleman ve özelliklerin biricik isimlere


sahip olmasını sağlar.Bir belge veya eleman için namespace olanağı sağlayan xmlns özelliği
bir işlem bilgisi olarak(processing instruction) düşünülebilir.

xmlns özelliğine ek olarak namespace’in veri tipinin de belirtilmesi gerekir ve bunun


için xmlns:dt değeri urn:schemas-microsoft-com:datatypes olarak set edilir.Örneği
inceleyelim:

<Schema name="MySchema" xmlns= urn:schemas-microsoft-com:xml-data">


xmlns:dt= xmlns= urn:schemas-microsoft-com:xml-datatypes">
<! - -Schema içerği buraya yazılır- ->
</Schema>

Schema elementi, AttributeType,ElementType ve description elementlerini child element


olarak içerebilir.

ElementType Element

Schema elementlerinin tip belirtimleri için ElementType elementi kullanılır. Bu


element ise yapısında datatype,element,group,AttributeType,attribute ve description child
elementlerini bulundurabilir.

ElementType elementi eleman tipinin belirtilebilesi için bazı özellikler içerir. Bunlar:

• name:Elementin ismini belirtir


• model:içerik modelin açık yada kapalı oluşunu belirtir
• content:Element içerisindeki içeriğin tipi
• order:Element içerisinde bulunan child element ve group’ların sırasını belirtir
• dt:type :Elementin tipini belirtir.

Şimdi bunları bir örnek üzerinde görelim:

<Element name="duration" content="textOnly" dt:type="time"/>


<ElementType name="distance" content="textOnly" dt:type="float"/>
<ElementType name="session" model="closed" content="eltOnly" order="seq">
<element type="duration"/>
<element type="distance"/>
</ElementType
Dikkat edilecek olursa duration ve distance elementleri önce ElementType
elemanının kullanılmasıyla bildirilmiş ve daha sonra session elemanının içerik modeli
içerisinde element elemanı kullanılarak tanımlanmıştır.

4.6. Well-Formed ve Validated XML Belgeleri

XML dökümanları verilen etiket isimleri ile kendini tanımlayabilir olmalıdır. Örneğin:

<okuladi>HACETTEPE</okuladi>

Burada açık olarak anlaşılıyor ki HACETTEPE bir okulun adıdır. Aslında işin
temeline inmemizde ben yine yarar görüyorum. En başta dedim ya temel sağlam olmalı. XML
dökümanları 2 kritere uymalıdır; iyi-oluşturulmuş(well-formed) ve geçerli(valid).

4.6.1. “Well-Formed” Belge

Bir XML dökümanının “well-formed” olması için aşağıdaki temel kurallara uyması
gereklidir:

1- HTML ve SGML gibi XML de büyüktür (>) ve küçüktür (<) karakterlerini ayıraçlar
olarak kullanır.
2- Bu karakterlerle etiket dediğimiz yapılar oluşturulur ve bunlar açıldığı zaman
kapatılmalıdır. Tek istisna boş elemandır(değeri olmayan eleman). Bu durumlarda
açma ve kapama etiketi aynı olabilir. Örneğin: <okuladi/> dediğimizde okuladi diye
bir etiketi açmış oluruz ama içinde herhangi bir değer bulunmaz.
3- Etiketlerin eklentileri çift-tırnak içine alınmalıdır. HTML bu açıdan esnektir fakat
XML bunu yapmanıza izin vermez. Örneğin HTML’de <font size=3> diye bilirsiniz
ama XML’de 3 kesinlikle çift-tırnaklar içine alınmalıdır.<font size=”3”>
4- Elemanlar aynı HTML’de olduğu gibi iç-içe düzgün bir şekilde tanımlanmalıdır. Her
XML dökümanı bir kök elemanına sahiptir ve diğer tüm elemanlar onun çocukları
olarak anılırlar. Hemen bir örnek verelim:

<universite>
<universiteadi>HACETTEPE</universiteadi>
<universitesehiri>Ankara</universitesehiri>
</universite>

5- XML’deki elemanlar büyük-küçük harf ayırt eder. Yani <universite> ile


<UNIVERSITE> iki ayri elemandır. Bu yönüyle de HTML’den farklıdır. Bu yüzden
XML kodları yazarken ençok karşılaşılacak sorun bu olabilir.

4.6.2. Geçerli Belge(VALID)

Geçerli bir belge kendi DTD’si veya şemasında(schema) tanımlanmış kurallara


uyan belgedir. DTDler ve şemalar o XML belgesinin her elemanının, neler kapsayabileceğini
ve o belgenin organizasyonel yapısını belirler.

Örneğin DTD’miz bu şekilde olsun.


<!ELEMENT kutlama(kime,ileti,kimden)>
<!ELEMENT kime (#PCDATA)>
<!ELEMENT ileti (#PCDATA)>
<!ELEMENT kimden (#PCDATA)>

Bu DTD’yi kullanan XML belgesi de şöyle olsun :

<?XML version=”1.0”?>
<!DOCTYPE kutlama SYSTEM “kutlama.dtd”>
<tebrik>
<kime> Mehmet </kime>
<ileti> Doğum Günün Kutlu Olsun </ileti>
</tebrik>

Örnekteki XML belgesi, XML kurallarına göre oluşturulmuş olduğundan, well-formed


bir belgedir. Oysa ki, XML belgesinin bildiriminde tanımlanan DTD’yi incelediğimizde,
DTD’de tanımlanmış bazı elemanların XML belgesinde bulunmadığı görülür. Ayrıca XML
belgesinde yer alan bazı elemanların tanımları DTD’de bulunmamaktadır. Bu nedenlerden
dolayı da XML belgesi well-formed olmasına rağmen geçerli değildir.

5. İlgili Teknolojiler

5.1. XSL (eXtensible Stylesheet Language)

XML önceden tanımlanmış etiketleri kullanmadığı için (kendi etiketlerimizi


tanımlayabildiğimiz için) , bu etiketlerin anlamı anlaşılmaz. <table>, bir HTML çizelgesi
anlamına gelebildiği gibi başka birçok anlama da gelebilir. XML’in doğal yapısından dolayı
tarayıcı XML belgesini nasıl görüntüleyeceğini bilemez.

Bu XML belgelerini göstermek için, belgelerin nasıl gösterilmesi gerektiğini


tanımlayan bir mekanizmaya ihtiyaç vardır. Bunlardan biri CSS (Cascading Style Sheets)’dir.
CSS, HTML ile kullanılmak üzere tasarlanmıştır. XML ile kullanılacak potansiyeli olmasına
rağmen, CSS'in temel işlevi sadece web görsel ortamıdır. Yani web üzerinden sunum
yapmaktır. CSS ile bir elemanın renk, büyüklük ve pozisyonu gibi özellikleri rahatlıkla
ayarlanabilmektedir. Ancak, sadece web üzerinden sunuma hitap etmesi ve verimize belli
kriterlere göre sorgulama yapamaması, CSS’yi çok fazla yaygınlaştıramamıştır.

XSL (eXtensible
Stylesheet Language) , XML’in
tercih edilen “style sheet” dilidir
ve XSL, HTML tarafından
kullanılan CSS’den daha
beceriklidir. XSL de , XML'in
yapısını kullanarak sunumlar
hazırlamak için kullanılır. Fakat
sunum, yalnız web üzerinden
değil, aynı zamanda işitsel ya da
yazılı da olabilir.

Diyelim ki, BAŞLIK diye bir kitap başlığı etiketimiz var. XSL'e, “BAŞLIKı gördüğün
zaman, içeriğini bold ve rengini kırmızı yap” kuralını tanımlıyoruz. (verimizi webde
yayınlamak istediğimizi düşünelim). XSL işlemcisi (mesela IE 5 içerisinde bulunan, ya da bir
XSL viewer), bunu HTML'e çeviriyor. Yani XSL, XML kodlarını değişik biçimlere çevirmek
için kurallar tanımlayan bir stil uygulaması olarak da düşünülebilir. Mesela, görme engelliler
için bir web sayfasından verilerin sese çevrilmesi gibi amaçlar için kullanmak hayal değildir

XSL 3 kısımdan oluşur:

• XML belgelerini çevirmeye yarayan yöntem.


• XML’in bölümlerini ve şablonlarını tanımlamaya yarayan yöntem
• XML belgelerini biçimlendiren yöntem.

Daha basitçe XSL, XML’i HTML’e ya da başka yapıdaki XML belgelerine çevirmeye
yarayan , XML verisini süzen ve sıralayan , XML belgesinin bölümlerini adresleyen , XML
verilerini veri değerine göre biçimlendiren (örneğin negatif değerleri kırmızı renkle gösteren),
XML verilerinin çıktısını değişik aygıtlara veren (ekran, kağıt vb.) bir dildir. Eğer belli yapıda
bazı verilerimiz var ve aynı amaç içinde kullanmamız gereken başka yapılarda verilerimiz de
varsa, ikisinin ortak bir yapıya dönüştürülmesi için, belgemizi başka bir XML belgesine
çevirmek gereğini duyabiliriz.

Üstteki üç madde aslında XSL’i oluşturan üç ayrı dile denk düşer:

• XSLT : XML’i çevirir.


• XPath : XML’in bölüm ve şablonlarını tanımlar.
• XSL-FO(Formatting Objects) : XML görüntülenmesini tanımlar.

XSLT, XML belgelerini diğer türden belgelere veya diğer XML belgelerine çevirmeye
yarar.

XPath, XML belgelerinin kısımlarını adreslemekte kullanılır. XPath, XSLT tarafından


kullanılır.

Biçimlendirme işlemi, XSL çevirisinin sonuçlarının, kullanıcı (okuyucu yada


dinleyici) tarafından anlaşılabilen uygun bir biçime dönüştürülmesidir.

XSL dili halen W3C tarafından geliştirilme aşamasında olduğu için burada
söylediklerimiz sadece ana içeriği belirtmekle yetiniyor. Daha ayrıntılı konular XSL
tamamlandığında görülecek.

Şimdi XML ile ilgili çok basit bir örneği inceleyerek daha iyi anlayalım :

<xsl:template match="kitapçı">
<H1>
<xsl:process-children/> 'ya hoş geldin
</H1>
</xsl:template>

Bu örnekte, belirtildiği gibi kitapçı etiketi bulunduğu zaman, kitapçı etiketine


belirttiğimiz bu kural uygulanacaktır. Mesela

<kitapçı>PANDORA<kitapçı>
şeklinde bir kaydımız varsa, bunun HTML çıktısı şöyle olacaktır :
<H1>
PANDORA'ya hoş geldin
</H1>

Bir XSL belgesinin genel biçimi aşağıdaki biçimdedir.

Bir XSL belgesi aşağıdakine benzer bir şekilde başlar. XSL de “Namespace”ler çok
önemlidir.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"
xmlns:fo="http://www.w3.org/TR/WD-xsl/FO" result-ns="fo">

Aşağıdaki şekilde bir kural belirlenir...

<xsl:template match="başlık">
<html:H1 ALIGN="CENTER">
<xsl:apply-templates/>
</html:H1>
</xsl:template>

Burada başlık etiketi görülen her yerin, ortalanarak yazılması için kural
tanımlanmıştır.

Ayrıca XSL'de bir programlama diline benzer olarak bazı kalıplar mümkündür. Mesela,
for-each döngüleri, if benzeri mantıksal işlemler, belli kriterlere göre sıralama ve bunun gibi
işlemler için aşağıdaki yapılar mevcuttur:

• <xsl:for-each select="xml/album">
• <xsl:value-of select="artist"/>
• <xsl:if match=“artist[0]”>
• <xsl:choose><xsl:when test=“artist”>
• <xsl:apply-templates select="xml">
• <xsl:template match="artist">
• <xsl:for-each select="xml/album" order-by="+category;+title">

5.1.1. XML'in Sunulması (CSS-XSLT)

Web'de yaygın olarak kullanılan markup dili HTML, sunuşa yönelik markup içerir.
HTML dokumanlarının sunumunu etkilemek için CSS stylesheet leri kullanılabilir. XML ise
anlamsal markup kullanır. Dolayısı ile XML verisinin herhangibir media tipinde sunulması bir
stylesheet gerektirir. XML verisinin görünümünü değiştirmek için CSS2 kullanılabilir.
XSLT(XSL Transformations) ise XML'i herhangibir biçimdeki başka bir XML dokumanına
veya HTML'e dönüştürmek için kullanılabilir. XSLT de bir W3C standardıdır.

XSLT'nin çalışma prensibini anlamak için CSS2 ile karşılaştıralım.


CSS, bir Web dokumanının sunuşunu (fontlar, renkler, kenar boşlukları,...) , onun
yapısına dokunmadan kontrol etmeye, değiştirmeye imkan sağlar. İşlem sırasında baz olarak
dokuman alınır.

XSLT'de ise sunuşun nasıl olacağını tamamen stylesheet içindeki komutlar berlirler.
Stylesheet, XML dokumanı içeriğini seçer ve sunum için biçimlendirmeyi belirler, hatta XML
dokumanında hiç olmayan bilgiler de ekleyebilir. Yani işlem sırasında baz olarak stylesheet
alınır. XSLT içinde, bir XML dokumanının bölümlerini tarif etmek için yine bir W3C
strandardı olan XPATH dili kullanılır. Ek olarak XSLT ile bir XML dokumanının belli
bölümleri filtrelenebilir, bölümler sıralanabilir (sort), dokuman tamamen dönüştürülebilir.

Şimdi basit örnek üzerinde XSLT'nin nasıl çalıştığına bakalım.

Kullanacağımız XML belgesi aşagıdaki gibi:

<?xml version="1.0" encoding="ISO-8859-1"?>


<musteriler>
<musteri>
<isim>Customer1</isim>
<siparis>siparis1</siparis>
<siparis>siparis2</siparis>
</musteri>
<musteri>
<isim>Customer2</isim>
<siparis>siparis3</siparis>
<siparis>siparis4</siparis>
</musteri>
<musteri>
<isim>Customer3</isim>
<siparis>siparis5</siparis>
</musteri>
</musteriler>

Bu XML dokumanını işleyeceğimiz XSL belgesi de aşağıdaki gibi:

<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/TR/REC-html40">

<xsl:template match="/">
<HTML>
<HEAD>
<TITLE>Musteriler</TITLE>
</HEAD>
<BODY>
<H1>Musteriler</H1>
<xsl:apply-templates/>
</BODY>
</HTML>
</xsl:template>

<xsl:template match="*">
<xsl:apply-templates/>
</xsl:template>

<xsl:template match="musteriler">
<TABLE>
<xsl:apply-templates select="musteri"/>
</TABLE>
</xsl:template>

<xsl:template match="musteri">
<TR>
<TH>
<xsl:apply-templates select="isim"/>
</TH>
<xsl:for-each select="siparis">
<TD>
<xsl:apply-templates/>
</TD>
</xsl:for-each>
</TR>
</xsl:template>

</xsl:stylesheet>

Buradaki mavi boyalı kısımlar XPATH “formatında” "pattern-matching" deyimleri,


yeşil boyalı kısımlar, XSLT komutları,
pembe boyalı kısımlar ise çıktının HTML biçiminde çıkmasını sağlayan HTML tagleridir.

Bu işlemin sonucunda oluşacak çıktı ise

<HTML xmlns="http://www.w3.org/TR/REC-html40">
<HEAD>
<TITLE>Musteriler</TITLE>
</HEAD>
<BODY>
<H1>Musteriler</H1>
<TABLE>
<TR>
<TH>Musteri1</TH>
<TD>Siparis1</TD>
<TD>Siparis2</TD>
</TR>
<TR>
<TH>Musteri2</TH>
<TD>Siparis3</TD>
<TD>Siparis4</TD>
</TR>
<TR>
<TH>Musteri3</TH>
<TD>Siparis5</TD>
</TR>
</TABLE>
</BODY>
</HTML>

şeklinde olacak ve tarayıcıda şu şekilde gözükecektir:

Musteriler
Musteri1 Siparis1 Siparis2
Musteri2 Siparis3 Siparis4
Musteri3 Siparis5

Bu kaynak ile aynı çıktıyı, sadeleştirilmiş bir XSL belgesi ile de elde edebiliriz. Bu XSL'de
<xsl:for-each> kullanılarak <xsl:template> elamanlarının adedi bir taneye indirgenmiş.

<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/TR/REC-html40">

<xsl:template match="/">
<HTML>
<HEAD>
<TITLE>Musteriler</TITLE>
</HEAD>
<BODY>
<H1>Musteriler</H1>
<TABLE>
<xsl:for-each select="musteriler/musteri">
<TR>
<TH>
<xsl:apply-templates select="isim"/>
</TH>
<xsl:for-each select="siparis">
<TD>
<xsl:apply-templates/>
</TD>
</xsl:for-each>
</TR>
</xsl:for-each>
</TABLE>
</BODY>
</HTML>
</xsl:template>

</xsl:stylesheet>

XSLT de bunlara ek olarak şu işlemler de gerçekleştirilebilir:


xsl:sort ile çıktıdaki XML elemanları farklı bir sıraya göre sıralanabilir
<xsl:sort> ‘un sıralama şeklini belirlemek için özellikleri vardır:
–order – "ascending" / "descending"
ya da –data-type – "text" / "number" , gibi

Örnek:
–<calisan> elemanlarının azalan <maas> elemanına göre sıralanması

<xsl:apply-templates select="calisan">
<xsl:sort select="maas"
order="descending"
data-type="number"/>
</xsl:apply-templates>

Birden çok <xsl:sort> ile çoklu sıralama yapılabilir

<xsl:apply-templates select="calisan">
<xsl:sort select="region"/>
<xsl:sort select="name"/>
</xsl:apply-templates>

xsl:variable ile değişkenler tanımlanabilir

<xsl:variable name="sehir" select="'Ankara'"/>

xsl:if ve xsl:when-xsl:choose komutları ile XML dokumanının içeriğine göre şartlı işlem
yapılabilir. Burada örneğin xsl:if proglamlamada bildiğimiz if deyimine karşılık gelirken
xsl:choose switch-case deyimine karşılık gelir.
<xsl:template match="calisan">
<xsl:if test="maas>50000">
Yuksek Maas --
</xsl:if>
<xsl:value-of select="isim"/><br/>
</xsl:template>

xsl:import ile birden fazla XSL dokumanı birleştirilebilir


<xsl:stylesheet xmlns:xsl="http://www.w3.org/XSL/Transform/1.0">
<xsl:import href="article.xsl"/>
<xsl:import href="bigfont.xsl"/>
<xsl:attribute-set name="note-style">
<xsl:attribute name="font-style">italic</xsl:attribute>
</xsl:attribute-set>
</xsl:stylesheet>

veya kaynak XML belgesinde hiç olmayan veriler eklenebilir, olan veriler tamamen
değiştirilebilir.

5.1.2. XQuery

XML Query SQL’in ilişkisel veri tabanlarının bağlamında kullanıldığı gibi kendi
deyimleriyle XML belgelerine veya veri kaynaklarına erişim , sorgulama , kullanımı sağlar.

XML Query’nin şekillenmesi halen devam etmektedir. Şu ana kadar üç düşünce şekil
almıştır: veri modellemesi , sorgu cebiri ve sözdizim. Buradaki asıl amaç XML Query’nin
bildirilebilir ve sözdiziminin XML uyumlu olmasıdır. Ayrıca sıradüzenselliğe ve dizilere
erişime , birleşikliğe izin verir.

Gittikçe daha çok bilgi XML kullanılarak saklanıp , transfer edildikçe XML veri
kaynaklarını akıllıca sorgulamak da o denli önem kazanıyor. XML’in en büyük güçlerinden
biri de çeşitli kaynaklardan elde edilen değişik bilgilerin sunumundaki esnekliğidir. Bu
esnekliği iyi bir şekilde kullanabilmek için , XML sorgu dili , bu bilgileri almak ve
yorumlamak için çeşitli özellikler sağlamalıdır.

XQuery aşağıdaki özelliklerle yakından ilgilidir :

• XQuery veri modeli , bir XML belgesi tarafından XQuery işleyicisine


sunulmuş bilginin nasıl olması gerektiğini tanımlar.
• XQuery’nin tür dizgesi XML Schema’yı taban alır.
• XQuery oluşturumundaki diğer bir gerekli özellik , oluşturulan XML sorgu
dilinin hem okunabilir bir sözdizime sahip olması hem de XML tabanlı bir
sözdizime sahip olmasıdır.

XQuery güçlü bir dildir. Sorgu , bir şemadan tür tanımları alabilir. Bir sorguyu
işletmek, durağan yazım aşaması ve dinamik hesaplama aşaması içerir. XQuery çoklu
uyumluluk düzeyine sahiptir. Örneğin durağan yazım denetimini içermeyen bir uyumluluk
düzeyi olabilir. Ya da şemadan tür tanımları alımını desteklemeyen bir uyumluluk düzeyi de
olabilir.

Xquery;
• İşlevsel dildir.
• Deyimler başka deyimlerle birleştirilebilir.

Xquery deki deyimler şunlardır:


• Sabitler ve değişkenler
$x, 47.2, “Merhaba”
• İşleçler ve işlev çağırmaları(function calls)
hesapla($a+1, $b-2), $kediler UNION $köpekler
• Yol deyimleri ( XPath notasyonunu kullanılır
/bolum[2]//sekil[baslik=“Kayısı”]

Xquery ile ilgili birkaç örnek;

“ ‘meyve.xml’ adlı belgenin, ikinci bölümünde ‘Kayısı’ başlıklı bütün şekilleri bul ”
document(“meyve.xml”)/bolum[2]//sekil[baslik=“Kayısı”]

“Hacettepe yayınevi tarafından 1999'da basılan bütün kitapları bul”


FOR $b IN document(“bib.xml”)//kitap
WHERE $b/year = “1999”
AND $b/yayinevi = “Hacettepe”
RETURN $b SORTBY (yazar, baslik)

“ ‘meyve.xml’ adlı belgede 2. Bölümden 5. Bölüme kadar olan bütün şekilleri bul.
document(“meyve.xml”)/bolum[RANGE 2 TO 5]//sekil

“ ‘bibly.xml’ belgesi içindeki bütün kitapları bul”


document("bibly.xml")//kitap

Bu sorgu sonucunda şöyle bir sonuc dönecektir.

<kitap yil="1994"> <baslik>İşletim Dizgeleri </baslik>


<yazar><soyisim>Saatçi</soyisim><isim>Ali</isim></yazar>
...

<kitap yil="2002"> <baslik>Veri Tabanı</baslik>


<yazar><soyisim>Yarımağan</soyisim><isim>Ünal</isim></yaz
ar>...

5.2. XHTML (eXtensible HyperText Mark-up Language)

XML ilk piyasaya çıktığında, onun HTML’in yerini alacağını hepimiz duymuşuzdur.
Bu kesinlikle mümkün değil, çünkü XML diğer işaretleme dillerini yaratmada kullanılacak bir
meta dildir. Gerçek amaç her zaman için HTML’i XML kurallarına göre yeniden
düzenlemekti. W3C bunu gerçekleştirdi ve sonuçta XHMTL oluştu. XHTML Ocak 2000’de
bir W3C standartı haline geldi ve şimdide web’de giderek yaygınlaşmaya başladı. Tarayıcı
şirketleri için bu , tarayıcılarını XHTML kodu ile çalıştırılabilir hale getirmelerini
gerektiriyordu. Uygulama geliştiricileri için ise dilin inceliklerinin öğrenmek lazımdı.

XHTML gerçekte HTML’e çok benziyordu. Böylece çok fazla yeni özellik ve element
öğrenmeye gerek yoktu. Uygulama geliştiriciler için en önemli değişim, XHTML’in sözdizim
kurallarına sıkı sıkıya bağlı olma zorunluğudur. Bu tarayıcıların o anki çalışma şekillerinden
oldukça değişikti. Eğer söz dizim hatalı bir HTML belgesi üretirsek çoğu tarayıcı bunu
görmemezlikten gelerek belgeyi yorumlayacaktır. Bu çeşit “görmezden gelme” özellikleri
XHMTL’de yok.
XHMTL ayrıca bir HTML uygulamasıdır. HTML standartının aslı, SGML kullanılarak
yazılmıştır. Fakat XML ile birlikte HTML’i XML uygulaması şeklinde yeniden düzenlemek
mantıklı hale gelmiştir. İşte bu çabanın sonucu XHTML 1.0 Standart’ıdır.

5.2.1. XHTMLin Getirdiği Yenilikler:

XHTML, HTML’in içerdiği birkaç sorunu ortadan kaldırır. Birincisi ve en önemlisi ,


bir XHTML belgesi sözdisimsel hatalı ise kullanılamaz. Bu XML sayesinde kazanılmış bir
özelliktir. XML’in en önemli özelliklerinden biri de , bir belgenin sözdizimsel olarak doğru
(”well-formed”) veya DTD’sine uygun (geçerli “valid”) olmadan uygulanamamasıdır. Bundan
yola çıkarak eğer herhangi XHTML belgesi sadece bir sözdizimsel hataya bile sahipse
reddedilir.

İkinci olarak, Web programcılarının CCS kullanarak, içeriğin web’de nasıl temsil
edileceğine etki etmelerini sağlar. En kesin haliyle XHMTL, herhangi bir elementinin,
belgenin içeriğinin nasıl temsil edileceğine etki etmesine izin vermez.

5.2.2. Neden XHMTL?

Şimdiden XHTML’in iki yararını öğrendik. Tabii bundan başka yararları da var. Şimdi
onlara göz atalım:

• Standartlaştırma: HTML her zaman standartlaştırılmış bir dil olmuştur. Fakat bu


standart, çoğu kez tarayıcılar ve yazılım araçları üreten yazılım şirketleri ve
programlamacılar tarafından görmezden gelinmiştir. Hakikaten Netscape ve
Microsoft’un hazırladığı patentli etiketler, diğer tarayıcılar için sorunlar çıkardı ve
W3C’yi HTML dünyasına bir düzen getirmeye mecbur etti. XHTML ile herkes
sözdizimsel kurallara uymak zorunda. Böylece koddan doğan sorunlar kalkmış olacak.
• Genişleyebilirlik: XHTML bir XML uygulaması olduğundan dolayı, kalıtımsal olarak
genişleyebilirdir. Bunun anlamı diğer elementlerin sözdiziminde en küçük etkiyi
yaratarak yeni elementlerin ve özelliklerin dile eklenebilmesidir. Bu XHTML’in sabit
hızla değişen web yayını ihtiyaçlarına cevap verebilmesinin sağlayacaktır.
• Dağınık kodlamayı engeller: Kodu kodlama alışkanlığı, geçmişteki sitelerin kabusu
haline gelmişti. Ayrıca arama motoru dizinleme programları, sitemizi dizinine dahil
ederken mümkün olan en iyi işi yapabilmesi için, iyi kodlanmış sitelere ihtiyaç duyar.
XHMTL bizi iyi kod yazmaya zorlarken, işlerin kodla uğraşacak insan ve programlar
için daha kolaylaşmasını sağlamış olur.
• Güçlendirilmiş bağlar: XML standartları, HTML standart internet bağlarından
(hyperlink) çok daha iyi bir bağlama şekli sağlar. Örneğin, XML bağlamadaki bir fikir,
tek bir internet bağının bir yerine birden çok kaynağa işaret etmesini içerir

5.2.3.XHTML Çeşitleri

Burada sayfanın başında dosya tipini belirlemeye yarayan üç tip görüyoruz bunlar;

XHTML 1.0 Strict


Bu dosya tipi basit sayfalar yaparken kullanılabilir. CSS kullanarak istenilen sonuçları
elde etmek kolaylaşır.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

XHTML 1.0 Transitional


Bu tip ile daha çok HTML'nin avantajları kullanılabilir ve CSS desteği bulunmayan
tarayıcılar için de yine bu tip kullanılmalıdır.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

XHTML 1.0 Frameset


Bu tip HTML'den gelen ve bir pencerede birden fazla sayfayı göstermede kullanılan
çerçeve (“frame”) yapısını destekler.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

Basit bir XHTML sayfası:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>Basit döküman</title>
</head>
<body>
<p>basit paragraf</p>
</body>
</html>

Görüldüğü gibi, XHTML ile HTML arasında çok fark yok. Bu bağlamda XHTML,
HTML'nin daha disiplinli halidir de denilebilir. Gerçekten de XHTML’in temeli sıkı
disiplindir. HTML tarayıcılarının genelde HTML kodundaki hataları görmezden gelerek
HTML sayfasını görüntülemesi gibi bir durum XHTML de bulunmuyor. Bu, XHTML’e atası
XML’den aktarılan bir özellik.

XHTML’in XML’den aldğı bir diğer özellik XHTML sayfalarının well-formed olma
özelliği. Aynı XML’de olduğu gibi XHTML’de de sözdizime uymayan belgelerin well-formed
özelliği olmuyor ve sonuçta geçersiz XHTML belgeleri olarak karşımıza çıkıyorlar.

Şimdi bir XHTML belgesinin well-formed sayılabilmesi için dikkat edilmesi gereken
özelliklere bakalım. Bu özellikler HTML’de “olmasa da olur” özelliklerdir.

5.2.4. XHTML Belgelerinin Özellikleri

İyi Şekillendirilme ve Çakışan kodlar

Doğru: <p>bir paragraf içinde <b>koyu kelimeler.</b></p>


Yanlış :<p>bir paragraf içinde <b>koyu kelimeler.</p></b>

Buradaki örnekte kodların açılıp kapanma sırasında nasıl kullanılması gerektiği


vurgulanmakta, en son açılan kod ilk kapanır.
Kodlar ve eklentiler küçük harf olmalı

Doğru : <li>
Yanlış : <LI>

Boş etiket olmamalı

Doğru : <p>bir paragraf.</p> <p>bir paragraf daha.</p>


Yanlış : <p>bir paragraf.<p>bir paragraf daha.
Burada açılmış bir kodun mutlaka kapatılması gerektiğini görüyoruz.
Eklenti değerleri tırnak içinde yazılmalı

Doğru : <table rows="3">


Yanlış : <table rows=3>

Sayısal değerlerde tırnak kullanmama gibi bir durum söz konusu değil. Bütün değerler
tırnak içerisinde yazılmalı.

Eklentiler kısaltılmadan kullanılır

Doğru: Yanlış:
<dl compact="compact"> <dl compact>
<input checked="checked"> <input checked>
<input readonly="readonly"> <input readonly>
<input disabled="disabled"> <input disabled>
<option selected="selected"> <option selected>
<frame noresize="noresize"> <frame noresize>

XHTML HTML
compact="compact" compact
checked="checked" checked
declare="declare" declare
readonly="readonly" readonly
disabled="disabled" disabled
selected="selected" selected
defer="defer" defer
ismap="ismap" ismap
nohref="nohref" nohref
noshade="noshade" noshade
nowrap="nowrap" nowrap
multiple="multiple" multiple
noresize="noresize" noresize

Boş kodlar slash (/) ile kapatılmalı


Burada HTML’de tekil kullanılan kodların da kapatılması gerektiğini görüyoruz.
Burada fark bir komutunda ; birden fazlka boş satır bıraklımak istendiğinde, kullanılan her
<br> komutu değil sadece birbirini takip eden en son komut kapatılıyor.
Doğru:
Satır sonu<br/>
İkili satır<br><br/>
Doğru : <br/><hr/><img src="resim.jpg" alt="resim" />
Yanlış: <br><hr>

Script ve Style elemanları


Sayfa içerisine konacak biçim ve scriptler aşağıdaki yapıda olmalıdır. Alternatifi,
script ve biçimler olabilir.

<script type="text/javascript">
<![CDATA[
... script içeriği ...
]]>
</script>

Resim Kodu

Doğru : <img src="resim.gif" id="resim1" />


Yanlış : <img src="resim.gif" name="resim1" />

Tablo Kodu

Kod Çıktı

<table border = "1">


<t1>
THEAD bölümü
<tr> TFOOT bölümü
<td>T1 bölümü</td> TBODY bölümü
</tr>
</t1>
<t2>
<tr>
<td>T2 bölümü</td>
</tr>
</t2>
<t3>
<tr>
<td>T3 bölümü</td>
</tr>
</t3>
</table>

6.Teşekkür

Herkesden önce bu çalışmanın hazırlanması için girişimde bulunan ve fikri ortaya atan
değerli hocamız Ebru Sezer’e , bölüm öğrencileri ve BBM bölümü için çok büyük fayda
sağlayacağına inandığımız bu faaliyetin altına imzasını attığı için çok teşekkür ediyoruz.

Çalışmanın hazırlanması sırasında bize elinden geldiğince yardım eden , hazırlama


aşamalarında yanımızda olan ve değerli görüşlerini bizden esirgemeyen Oğuz Aslantürk’e ,
bize kendisiyle çalışmayı tercih etmekte ne kadar haklı olduğumuzu gösterdiği için teşekkür
ediyoruz.
Bize çalışma esnasında gerekli olan mühendislik formasyonunu ve bilişim
konusundaki yeniliklere kolayca adapte olup çalışmamızın gerek araştırma gerek hazırlama
kısmında temel oluşturacak bilgileri bize sağlamış olan tüm BBM bölümü hocalarına ve
araştırma görevlilerine sonsuz teşekkür ediyoruz.

Çalışmanın hazırlanması esnasında bizi dinleyen ve etkili eleştirilerde bulunan , ayrıca


manevi açıdan her zaman yanımızda olan ve bizi destekleyen başta sınıf arkadaşlarımız
olmak üzere bütün arkadaşlarımıza teşekkür ediyoruz.

Kaynakça

www.w3c.org
www.ibm.com
www.microsoft.com
www.softwareag.com
www.softwareag.com.tr
www.xml.com
www.xml.org
www.xmlnedir.com

Using XHTML , XML and Java2 Platinum Edition


Eric Ladd , Jim O’Donnell , Mike Morgan , Andrew H. Watt ,
November 2000 QUE Press

Hazırlayanlar

Mehmet Gursul
Tolga Ovatman
Levent Tanin

Linkler

http://ata.cs.hun.edu.tr/not/duyuru/duyuru09_09_2002_04-37-18.html

http://www.turkcenet.org

You might also like