ELEMENT'LER İLE ÇALIŞMAK


Elementler DTD içinde element bildirimleri yapılarak tanımlanırlar. Bu tanımlama şu şekilde yapılır:

< !ELEMENT ElementName Type >

ElementName, element ismini belirten bir markup değeridir ve DTD içerisinde tek(unique) olmalıdır.Elementin tip değeri "Type" olarak belirtilmiştir.Bu değer ayrıca elementin içerik değeri olarak da bilinir.

 

XML dört tipteki element değerini destekler:

 

Empty:Herhangi bir içeriği olmayan fakat attribute içerebilen element

Element Only:Sadece child element içeren element

Mixed:child element ve karakter verisinin kombinasyonunu içeren element

Any:DTD tarafından müsaade edilen herhangi bir içeriği içeren element

 

Empty Element

Adından da anlaşılacağı gibi bu tür elementler herhangi bir içerik içermezler.Empty elementler şu şekilde deklare edilirler:

 

< !ELEMENT ElementName EMPTY >

aşağıda bir empty element deklare ediliş örneği görülmektedir

< !ELEMENT img EMPTY>

Bir empty element doküman içerisinde şu iki yoldan birisi ile tanımlanır:

 

bir start/end tag çifti

bir empty(boş) tag

 

Şimdi start/end tag ile yapılan bir emty tag örneği verelim:

<img src="Baslik.gif" < > /img>

 

Dikkat edilirse tag ler arasında herhangi bir içerik değeri yoktur. Empty element tanımı için şimdi Empty tag kullanımına örnek verelim:

<img src="Baslik.gif" / >

Görüleceği gibi empty tag aslında bir çeşit start/end tag olarak düşünülebilir.

 

Element-Only Element

Child elementleri dışında herhangi bir şey içermeyen elementlerdir.Bu tip bir element, elementin içerik modelini belirterek yapılır yani element deklarasyonu içerisinde child elementleri içeren genel bir listenin oluşturulması sayesinde yapılır.

Bir elementin içerik modeli şu şekilde oluşturulur:

< !ELEMENT ElementName ContentModel >

 

İçerik modelinin kendisi de özel sembol ve child element isimlerinin kombinasyonu sonucu oluşur.Bir elementin içerik modelinin oluşturulması için şu semboller kullanılır:

Parantez(( )) child elemente ait bir grup ve diziyi bitirmek için kullanılır

Virgül(,) dizideki başlıkları ayırmak için kullanılır

Pipe(|) seçimsel gruplar arasındaki başlıkları ayırmak için kullanılır

Sembol yoksa bir child element in mutlaka bir kez görüneceği anlamı çıkar

Soru işareti(?) child elementin ya bir kez görüneceğini yada hiç görünmeyeceğini belirtmek için kullanılır

Asterisk(*) Bir child elementin birden fazla sayıda görülebileceğini belirtir

Artı işareti(+) Child elementin en az bir kere görüleceğini belirtir

 

Bahsedilen bu sembolleri anlamanın en güzel yolu elbette örneklere göz atmak olacaktır.

Aşağıdaki örnekte resume elementine ait içerik modelin oluşturulmasına göz atalım

< ELEMENT genel (bilgi,(egitim | deneyim+)+,hobi?,referanslar*) >

 

Mixed Elements

Mixed elementler hem karakter tipindeki veriyi hem de child elementleri içerebilirler.En basit mixed element sadece karakter verisi içeren olacaktır.Bu tipteki bir element bazen text-only element olarak da adlandırılır.Text-only elementler şu şekilde tanımlanır:

< !ELEMENT ElementName (#PCDATA) >

Text-only elementler için yapılan içerik modeli tanımlamalarında (#PCDATA) terimi kullanılır ve bu terim elementin parse edilmiş karakter verisi içerdiğini bildirir.

Örneğin:

< !ELEMENT band (#PCDATA) >

Bu element XML dokümanı içindeki cd koleksiyonuna ait olan bir bandın ismini markup etmek için kullanılmış olabilir.Aşağıdaki örnekte döküman içerisinde bu band elementinin nasıl tanımlandığı görülüyor:

<band> Candan Ercetin </band>

Aşağıdaki örnekte bir film koleksiyon bildirim kodunun oluşturulması görülmektedir:

 

<!ELEMENT filmler (film)+>

<!ELEMENT film (baslik,yazar+,produktor+,yonetmen+,aktor*,yorumlar?)>

<!ELEMENT baslik (#PCDATA)>

<!ELEMENT yazar (#PCDATA)>

<!ELEMENT produktor (#PCDATA)>

<!ELEMENT yonetmen (#PCDATA)>

<!ELEMENT aktor (#PCDATA)>

<!ELEMENT yorumlar (#PCDATA)>

Bu DTD nin yapısını biraz daha inceleyelim:

Film elementinin içinde bulunan başlık elementi sadece bir kez görünmelidir. Yazar,produktor ve yönetmen elementleri de en azından bir kez görünmelidir,ancak bu elementler daha fazla seferde görünebilirler. Aktor elementi herhangi bir sayıda doküman içinde görünebilmektedir. Film ‘in içerik modelindeki son eleman olan yorumlar elementi film hakkında ki yorumları içeren bir liste elde etmemizi sağlamaktadır.

 

Burada akılda tutmamız gereken şey mixed yapıdaki bir elementin child elementler içermeyeceğidir.

İşin detayına indiğimizde mixed elementlerin deklare edilişinin element-only elementlerin deklare edilişine çok benzerlik gösterdiğini görmekteyiz. Mixed bir elementin içerik modelitekrarlanan bir seçim listesi içerir ve yazılımı şöyledir:

<!ELEMENT ElementName (#PCDATA | ElementList)>

Buradan da görüleceği üzere #PCDATA mixed elementin karakter verisini de içerebileceğini gösterir. Seçim listesinden arda kalan şey child elementleri ve element-only elemente benzeyen düzenli elementleri içerir. Daha sonra tekrar #PCDATA kullanılması durumunda child elementlerde de karakter verisinin kullanılabileceği anlamına gelir. Dikkat edilirse asterisk(*) içerik modelin en sonunda göze çarpar ve bu da tüm seçim listesinin opsiyonel bir yapıda olduğunu belirtir. Aşağıda #PCDATA ile seçim listesinin nasıl kullanılabileceği gösterilmiştir.

<!ELEMENT hatırlatma (#PCDATA | başlık | konu)*>

Not :Bir mixed elementin içerik modelinde,karakter verisi (#PCDATA) mutlaka ilk olarak seçim listesinin içinde belirtilmesi gerekir ve seçim listesinin kendisi de asterisk(*) izlemelidir

ANY Elementler

XML tarafından desteklenen en son element türüdür ve ANY sembolü ile deklare edilirler. Bu element türü hemen hemen belirgin bir yapısı olmamasına karşın karakter verisi,deklare edilmiş element tiplerini veya bunların karışımını içerebilir.Bu element türünü geniş kapsamlı açık bir içerik modeli olarak düşünebiliriz.Şu şekilde yazımları vardır:

<!ELEMENT ElementName ANY>

 

ATTRIBUTE'LER İLE ÇALIŞMAK


Attribute’ler attribute deklerasyon listesi denilen bir liste içinde aşağıda belirtilen şekilde tanımlanırlar:

<!ATTLIST ElementName AttrName AttrType Default>

 

Görüleceği gibi bir attribute isim(AttrName) ve tip(AttrType) ve default olmak üzere üç bileşenden oluşmaktadır. Bir attribute deklerasyonu sırasında kullanılabilecek olan dört default değeri vardır:

#REQUIRED

#IMPLIED

#FIXED

default

 

#REQUIRED değeri attribute’ın element için mutlaka gerekli olduğunu belirtir. #IMPLIED değeri attribute ‘ın seçimsel olduğunu ve element için kullanımının zorunlu olmadığını belirtir. #FIXED değeri attribute’a atanacak değerin sabit olacağını ve bunun da attribute’u bir bilginin sabit bir parçası durumuna getireceğini belirtir.

 

XML 10 tane farklı attribute tipini desteklemektedir:

 

CDATA :Parse edilmemiş karakter verisi

Enumerated :Bir dizi string değeri

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 :Unique bir tanımlayıcı

IDREF: DTD içinde tanımlanmış olan bir ID ye refere 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’leri

String attribute ler CDATA tarafından gösterilen ve en çok kullanılan attribute tipidir. CDATA tipi attribute’ın bir metin stringini 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’in oyuncu elementi için gerekli olan bir karakter verisi attribute dur. Bu takım attribute’ını seçimsel duruma getirmek isteseydik;

<!ATTLIST oyuncu takim CDATA #IMPLIED>

şeklinde kullanmamız gerekirdi.

Burada karşımıza önemli bir soru çıkmaktadır:XML parser acaba string attribute tipini diğerlerinden nasıl ayırt edebilmektedir?

 

Bir XML parser CDATA attribute değerinin işleme konması sırasında boşlukların tümünü reserve eder. Satır sonlarının whitespace boşluklarına dönüştürülme işlemi string attribute değerinin normalizasyonu olarak adlandırılır.

Enumerated Attribute’ler

Bu tür attribute ler daha önceden tanımlanmış bir metin dizisinin listesini içerirler. Enumerated tipi CDATA tipine benzemektedir ancak bu veri tipinde kabul edilebilir attribute değerleri attribute listesi deklerasyonu içinde sağlanmaktadır. Daha önce vermiş olduğumuz örneği biraz daha geliştirelim. Oyuncu elementine enumerated bir attribute 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 girmiştir.

Notasyon Attribute’ler

Enumeration attribute’ın özel bir kullanımı da notasyon attribute laridir. Notasyonlar DTD içinde bir yerlerde tanımlanmış olan bir liste olarak düşünülebilir. Bu deklerasyonu DTD içerisinde NOTATION anahtar sözcüğünü kullanarak şu şekilde yazabiliriz:

<!ATTLIST image format NOTATION (gif | jpeg) #REQUIRED)>

Dikkat edilirse #REQUIRED sembolü attribute’un gerekli olduğunu belirtmeye yarıyordu. Enumerated attribute değerleri opsiyonel de olabilir. Bunun için #IMPLIED terimini kullanmamız gerekir.

Tokenize Attribute’ler

XML tarafından desteklenen son attribute tipi tokenize attribute’lerdir. Bunlar XML parser tarafından attribute’ların token larına ayrıştırılması işlemini yaparlar. XML parser bu token’larına ayrıştırma işlemi sonucunda tüm boşluk ve tek karakter sembollerini eleme işlemine tabi tutar. ENTITY,ENTITIES,ID,IDREF,IDREFS,NMTOKEN ve NMTOKENS tokenized attribute tipleridir.

 

ENTITY ve ENTITIES tipleri entity lere refere olmak için kullanılır. Örneğin image’ler tipik olarak binary entity’ler şeklinde refere olurlar. ENTITIES tipi ENTITY e benzemektedir ve bir entity listesi oluşturmamıza yararlar. Aşağıda ENTITY attribute tipinin reference işleminin oluşturulması gösterilmiştir.

<!ATTLIST bolum id ID #REQUIRED>

IDREF ve IDREFS tipleri ID lere yapılacak olan reference’leri belirtmek için kullanılır. Bu tipler ID tipine benzerler ancak burada akılda tutulması gereken şey bunların kendilerinin de unique yapıda olmalarıdır.

 

NMTOKEN ve NMTOKENS attribute tipleri token isim değerlerini içerirler.Bir isim token, string yapıda olan bir metin değeridir.Genelde isim token değeri sadece tek bir ismi içerir ve boşluk içermez.

Birden Fazla Attribute Deklarasyonu

Buraya kadar olan bölümde ayrı attribute’lerin örneklerini gördük. Elbette elementler birden fazla attribute içerebilirler. Bir elementin tüm attribute değerlerini tek bir attribute list’te tutmak elbette en mantıklı çözümdür. Aşağıda buna ilişkin bir örnek görülmektedir:

 

DTD'NİN DETAYLARI


Entity’ler ve döküman yapısı

Bir XML dokümanı entity adı verilen depolama birimlerine bölünmüştür ve bu bölümler ise unique isimler alırlar. Bu entity lerden birisi document entity olarak isimlendirilir ve dokümanın en üstünde yer alır. Document entity aslında dokümanın tümünü içerir diyebiliriz.

Entity ler dokümanın fiziksel yapısını tarif ederler. Bundan dolayı çoğu zaman dosyalara birleşik olarak bulunurlar. Gerçekte,entity lerin çoğu sistem üzerinde kayıtlı dosyalara karşılık gelmektedirler. Biraz daha detaya inecek olursak bu entity ler bir veritabanı kaydı veya belleğin herhangi bir kısmıyla birleşebilirler. Burada akılda tutulması gereken en önemli nokta entity kavramının daima depolamayla ilgili oluşudur.

Daha önce verilen bir örneği tekrar gözden geçirelim:

 

<?xml version="1.0" standalone="no">

<!DOCTYPE filmler SYSTEM "filmler.dtd">

<filmler>

...

</filmler>

 

Buradan görüleceği gibi document type decleration filmler root elementi ve filmler. Dtd dışsal altkümesi olmak üzere iki entity den bahseder."filmler.dtd " dışsal alt kümesini yerini değiştirerek entity olarak değerlendirilmemesini sağlamak da mümkündür. Burada anahtar nokta dışsal bir DTD alt kümesinin depolanış şekline dikkat etmek olacaktır.

Karakterler ve entity’ler

Entity lerin deklarasyonu ve referans işlemlerinin detaylarında girmeden önce karakterlerin entity’ler içerisinde nasıl kullanıldığını anlamak çok önemlidir. Çünkü XML karakterlerin encoding işlemi sırasında değişik standartlar kullanır ve bu da ona büyük bir esneklik sağlar. XML karakter encoding işleminin temelinde ISO/IEC 10646 Unicode standardı kullanılmaktadır. Bu standart karakter kullanımında inanılmaz bir esneklik sağlar.

Bu standarda ek olarak ISO 8859 veya JIS X-0208-1997 standardı da kullanılabilmektedir. Bu standart terimler size karışık geliyorsa Unicode seçeneğini kullanmak uygun olacaktır.

Karakter encoding deklarasyonu dokümanın başlangıcında karakter encoding decleration denilen kısımda yapılır. Bu deklarasyon kısmı XML attribute deklarasyonuna benzer.

<?xml version="1.0" encoding="UTF-8"?>

Burada UTF-8 değeri yukarıda bahsedilmiş olan ISO/EIC 10646 standardını bir altkümesi olarak düşünülebilir. UTF-8 ve UTF-16 karakter encoding işlemlerinde en sık kullanılan standartlardır ve bu iki encoding standardı hemen hemen tüm XML processor’lar tarafından desteklenmektedir.

Aşağıda karakter encoding işlemlerini içeren bir liste görülmektedir.

 

UTF-8(Unicode)

UTF-16(Unicode)

ISO-10646-UCS-2(Unicode)

ISO-10646-UCS-4(Unicode)

ISO-8559-1 (ISO-8559-9 üzerinden)

ISO-2022-JP(JIS X-0208-1997)

EUC-JP(JIS X-0208-1997)

Shift_JIS(JIS X-0208-1997)

XML, karakter referans için iki tekniği destekler:

 

decimal referans(base 10)

hexadecimal referans(base 16)

 

Decimal character referans karakterin, sayısal olarak 10 tabanına göre refere edilmesi ilkesinedayanır.Decimal referans işlemi (&#) işaretini takiben karakter numarasının yazılması ve sona semicolon(;) konulması sonucu elde edilir. Genel yazımı:

&#Num;

şeklindedir.

 

&#169;

örneğinde bu karakter referans işleminde desimal olarak 169 değerine karşılık gelen karakter değeri(bu copright işaretine karşılık gelir.)

Şimdi copright işaretine karşılık gelen bu karakter değerinin refere edilme işlemine bir gözatalım:

&#169;1999 Emre Ultav

Refere etme işlemi sırasında kullanılan diğer bir teknikde base-16 tekniği yani hexadecimal tekniktir. Bunun genel yazılımı ise

&#xNum;

şeklindedir. Tekniğin temel işleyişi aynıdır.

Decimal olarak 169 değerine sahip olan karakter hexadecimal olarak refere edileceğinde:

&#xA9;

şeklinde refere edilecektir.

 

Entity’ler ile Çalışmak

Bir XML dokümanı en az bir tane entity içerir. İçerilen bu entity, "document entity" olarak isimlendirilir ve bir XML processor yapacağı işlemlere document entity’den başlar. Çünkü document entity doküman hiyerarşisini şekillendirir.

XML dokümanı içerisinde yer alacak olan entity’ler kullanılmadan önce deklare edilmek zorundadırlar. Bir entity deklerasyonu unique bir entity ismi ve bu isme eklenmiş olan bir veri parçasını içerir. Belirtilen bu unique isim değerine aşağıdakilerden birini ekleyebiliriz:

bir metin dizisi

bir DTD bölümü

XML metini içere bir dışsal referans(External referans)

Binary veri içeren bir dışsal referans(External referans)

 

Görüleceği gibi entity’ler depolayacağı veriler incelendiğinde son derece esnek bir yapıda oldukları anlaşılmaktadır. Ancak genel hatları ile incelendiğinde entity’ler XML dokümanı içerisinde iki şekilde kullanılırlar:

parsed entity’ler

unparsed entity’ler.

Parsed entity’ler XML parser tarafından parse edilmiş veriyi depolarlar. Yani sadece metin(text) içerebilirler. Diğer yandan unparsed entity’lerde ise veri parse edilmemiştir ve dolayısıyla bir metin veya binary veri depolanabilir.

Parse edilmiş entity’ler doküman açısından biraz daha değişik anlamda incelenirler. Bu tür entity ler iki ana gruba ayrılırlar:

Genel entity’ler-doküman içeriğinde kullanılan entityler

Parameter entity’ler-sadece DTD içinde kullanılan entity’ler