Bölüm 3 – Geçerli-XML Belgeleri Oluşturmak İçindekiler 1.1 Geçerli XML Belgeleri 1.2 DTD 1.3 Element Tiplerini Tanımlamak 1.4 Element İçerik Tipleri 1.5 Element İçeriğini Tanımlamak 1.6 DTD’de Nitelik Tanımlamaları 1.7 DTD’yi Ayrı Dosya Olarak Tanımlama 1.8 Özet
Giriş Geçen bölümde “iyi-biçimli” XML belgesi nasıl oluşturulur konusundan bahsetmiştik. Herkesin kolayca XML belgesi oluşturabileceğini görmüş olduk Ama bu uygulamalar için yeterli değildir. Belgenin yapısı hakkında bilgiye sahip olamamız gerekir.
Giriş
Dökümanı Tanımlamak Neden Önemli? Giriş Dökümanı Tanımlamak Neden Önemli? Standartlaşma ve yaygın kullanım MathML , CML,AML Standartlaşmış veya geniş kabul gören bir döküman tanıtım belgesi
DTD (Document Type Definition) DTD, XML belgesinin giriş kısmına eklenir. DTD <!DOCTYPE işaretlemesi ile başlar. Daha sonra root elementin ismi yazılır. Köşeli parantezler içinde tip tanımları yapılır. <?xml version ="1.0" encoding ="ISO-8859-9" ?> <!DOCTYPE turlar-rehberi [<! Tip tanımlaması_1> <! Tip tanımlaması_2> <! Tip tanımlaması_3> ]> <turlar-rehberi> <tur> <tur-adi cinsi="kültür gezisi">Ege Turu</tur-adi> <güzergah>Ayvalık, İzmir, Çeşme, Kuşadası, Aydın</güzergah> <baslangic-tarihi>07-07-2004</baslangic-tarihi> <bitis-tarihi>07-08-2004</bitis-tarihi> <ulasim>Otobüs</ulasim> <konaklama>3,4 yıldızlı oteller</konaklama> </tur> </turlar-rehberi>
Element Tiplerinin Tanımlamak <?xml version ="1.0" encoding ="ISO-8859-9" ?> <!DOCTYPE turlar-rehberi [ <!ELEMENT turlar_rehberi (#PCDATA)>]> ]> <turlar-rehberi> Ege Turu </turlar-rehberi> Eğer DTD tanımına bağlı kalarak döküman oluşturursak bu dökümana “geçerli” döküman denir. İyi oluşumlu Geçerli
Element İçeriğini Tanımlamak Element_sira.xml <?xml version ="1.0" encoding ="ISO-8859-9" ?> <!DOCTYPE turlar-rehberi [ <!ELEMENT turlar_rehberi (tur)> <!ELEMENT tur(tur-adı,güzergah, başlangıç-tarihi)> <!ELEMENT tur-adı(#PCDATA)> <!ELEMENT güzergah(#PCDATA)> <!ELEMENT başlangıç-tarihi(#PCDATA)> ]>
Element İçeriğini Tanımlamak Element_secenek.xml <?xml version ="1.0" encoding ="ISO-8859-9" ?> <!DOCTYPE turlar-rehberi [ <!ELEMENT turlar_rehberi (tur)> <!ELEMENT tur(tur-adı | güzergah | başlangıç-tarihi)> <!ELEMENT tur-adı(#PCDATA)> <!ELEMENT güzergah(#PCDATA)> <!ELEMENT başlangıç-tarihi(#PCDATA)> ]> Seçenekleri Artırmak Eklenen karakter Açıklama + Element bir yada daha çok kullanılabilir. * Element sıfır yada daha çok kullanılabilir. ? Element sıfır veya bir kere kullanılabilir.
Element İçeriğini Tanımlamak Element_secenek.xml <?xml version ="1.0" encoding ="ISO-8859-9" ?> <!DOCTYPE turlar-rehberi [ <!ELEMENT turlar_rehberi (tur)> <!ELEMENT tur(tur-adı? | güzergah | başlangıç-tarihi)> <!ELEMENT tur(tur-adı | güzergah | başlangıç-tarihi)+> <!ELEMENT tur(tur-adı , güzergah , başlangıç-tarihi | bitiş-tarihi)> <!ELEMENT tur(tur-adı , güzergah , (başlangıç-tarihi | bitiş-tarihi)+)> <!ELEMENT tur(#PCDATA | tur-adı | güzergah | (başlangıç-tarihi )*> <!ELEMENT tur-adı(#PCDATA)> <!ELEMENT güzergah(#PCDATA)> <!ELEMENT başlangıç-tarihi(#PCDATA)> ]>
ANY ve EMPTY içerik tanımlaması Her türlü olasılıkta içerik kullanımını tanımlar.DTD’nin en esnek tanımlamasıdır. <!ELEMENT tur (tur-adı,güzergah, (başlangıç-tarihi | bitiş-tarihi)+)> tanımlaması yerine <!ELEMENT tur ANY> yazılabilir. EMPTY Boş içerikli elementler için EMPTY ifadesi kullanılır. <?xml version ="1.0" encoding ="ISO-8859-9" ?> <!DOCTYPE turlar-rehberi [ <!ELEMENT turlar_rehberi (tur)> <!ELEMENT tur(resim)> <!ELEMENT resim EMPTY> ]>
DTD’de Nitelik Tanımlama Nitelik_tanımlama.xml <?xml version ="1.0" encoding ="ISO-8859-9" ?> <!DOCTYPE turlar-rehberi [ <!ELEMENT turlar_rehberi (tur)> <!ELEMENT tur(tur-adı,güzergah, başlangıç-tarihi)> <!ELEMENT tur-adı(#PCDATA)> <!ELEMENT güzergah(#PCDATA)> <!ELEMENT başlangıç-tarihi(#PCDATA)> <!ATTLIST tur cinsi CDATA #IMPLIED> ]> XML dosyasında <turlar-rehberi> <tur cinsi=“kültür”> .......... ...........
DTD’de Nitelik Tanımlama Nitelik Tipleri Niteliğin karakter verisi içereceğini belirten ve CDATA ile gösterilen nitelik tipi tanımlaması Niteliğin değerinin belirtilmesinde seçim sunan “seçimli nitelik tipi” Özel ifadelerle tanımlı nitelik tipleri Nitelik varsayımı Element içinde, nitelik kullanımının zorunlu olup olmadığını belirler.Dört çeşit olabilir #REQUIRED #IMPLIED #FIXED Tanımlı Değer
Nitelik Varsayımı #REQUIRED Element içinde belirtilen niteliğin tanımlanmasını zorunlu kılar. Eğer nitelik tanımlanmazsa geçersiz belge hatası oluşur. <?xml version ="1.0" encoding ="ISO-8859-9" ?> <!DOCTYPE turlar-rehberi [ <!ELEMENT turlar_rehberi (tur)> <!ELEMENT tur(#PCDATA)> <!ATTLIST tur cinsi CDATA #REQUIRED>
Nitelik Varsayımı #IMPLIED Niteliğin tanımlaması seçime bağlıdır. <?xml version ="1.0" encoding ="ISO-8859-9" ?> <!DOCTYPE turlar-rehberi [ <!ELEMENT turlar_rehberi (tur)> <!ELEMENT tur(#PCDATA)> <!ATTLIST tur cinsi CDATA #IMPLIED>
Nitelik Varsayımı Tanımlı Değer Elementin nitelik değerini belirtmemizi sağlar.Element içinde nitelik tanımı yapılıp yapılmaması zorunlu değildir. <?xml version ="1.0" encoding ="ISO-8859-9" ?> <!DOCTYPE turlar-rehberi [ <!ELEMENT turlar_rehberi (tur)> <!ELEMENT tur(#PCDATA)> <!ATTLIST tur cinsi CDATA “pansiyon”>
Nitelik Varsayımı #FIXED Kullanımı tanımlı değer gibidir. Farklı olarak tanımlı değerleri sabitler ve farklı değer tanımlamaya izin vermez. <?xml version ="1.0" encoding ="ISO-8859-9" ?> <!DOCTYPE turlar-rehberi [ <!ELEMENT turlar_rehberi (tur)> <!ELEMENT tur(#PCDATA)> <!ATTLIST tur cinsi CDATA #FIXED “pansiyon”>
Seçmeli nitelik değerleri tanımlaması Nitelik Tipleri Seçmeli nitelik değerleri tanımlaması <?xml version ="1.0" encoding ="ISO-8859-9" ?> <!DOCTYPE turlar-rehberi [ <!ELEMENT turlar_rehberi (tur)> <!ELEMENT tur(#PCDATA)> <!ATTLIST tur konaklama (pansiyon | otel) #REQUIRED> <!ATTLIST tur konaklama (pansiyon | otel) #IMPLIED> <!ATTLIST tur konaklama (pansiyon | otel) “otel”> ]>
Özel İfadelerle tanımlı nitelik tipleri ID: Ayni nitelik her elementte farklı değer almalıdır. IDREF: ID referansı tanımlayan bir anahtar kelimedir. Belirtilen ID’nin atnımlayıcısına başvurur.
1 <?xml version = "1.0"?> 2 3 <!-- Fig. 6.8: IDExample.xml --> 4 <!-- Example for ID and IDREF values of attributes --> 5 6 <!DOCTYPE bookstore [ 7 <!ELEMENT bookstore ( shipping+, book+ )> 8 <!ELEMENT shipping ( duration )> 9 <!ATTLIST shipping shipID ID #REQUIRED> 10 <!ELEMENT book ( #PCDATA )> 11 <!ATTLIST book shippedBy IDREF #IMPLIED> 12 <!ELEMENT duration ( #PCDATA )> 13 ]> 14 15 <bookstore> 16 <shipping shipID = "s1"> 17 <duration>2 to 4 days</duration> 18 </shipping> 19
20 <shipping shipID = "s2"> 21 <duration>1 day</duration> 22 </shipping> 23 24 <book shippedBy = "s2"> 25 Java How to Program 3rd edition. 26 </book> 27 28 <book shippedBy = "s2"> 29 C How to Program 3rd edition. 30 </book> 31 32 <book shippedBy = "s1"> 33 C++ How to Program 3rd edition. 34 </book> 35 </bookstore>
DTD’yi Ayrı Bir Dosya Olarak Tanımlamak Avantajları: DTD’yi birden fazla XML belgesi kullanabilir. DTD ‘de yapılacak değişikler onu kullanan tüm XML dosyalarını etkileyecek. Nasıl oluşur? Ayrı bir dosyada düzenlenir. Dtd uzantılı olarak kaydedilir. [] parantezler kullanılmaz.
Dıştadtd_tanimlama.dtd <?xml version ="1.0" encoding ="ISO-8859-9" ?> <!ELEMENT turlar_rehberi (tur)> <!ELEMENT tur(tur-adı,güzergah, başlangıç-tarihi)> <!ELEMENT tur-adı(#PCDATA)> <!ELEMENT güzergah(#PCDATA)> <!ELEMENT başlangıç-tarihi(#PCDATA)> <!ATTLIST tur cinsi CDATA #IMPLIED> Dışdtd_döküman.xml <!DOCTYPE turlar-rehberi SYSTEM “dıştadtd_tanimlama.dtd”> <turlar-rehberi> <tur> <tur-adı> Karadeniz turu</tur-adı> ...... </turlar-rehberi>
Özet DTD, XML belgelerinin şablonu, tipini çıkarmaya yarayan yöntemdir. Bu yönteme uyan belgelere “geçerli”, uymayanlara “geçersiz” belge denir. “Geçerli” belge aynı zamanda “iyi biçimli” belge anlamına da gelir. Ama yukarıdaki ifadenin tersi doğru değildir.