BilgiTeknoloji.net    
b i l g i   t e k n o l o j i   y a z ı l ı m

Ana Sayfa

Marjinal XML Access Pratik Uygulamalar Projeler Ekonometri Dilimiz Çetrefil İletişim
 

XML Belgelerinde Geçerlilik Tanımlamaları ve DTD


Paylaşılan XML verilerinin doğrulanması için tarafların üzerinde anlaştığı şablonlar gerekiyor. Belgenin XML türünde olmasından ziyade, belli bir kalıpta olması önemlidir.

Bu yazıda XML belgelerini geçerli kılma yolları ve kurallar kümesi tanımlama hakkında bilgiler yer alıyor.


XML'in en önemli amaçlarından biri paylaşılan verilerin standartlaştırılmasını sağlamaktır. Verilerin XML dosyası halinde dağıtılması, standartlara uymuş olmak anlamına gelmiyor. Asıl gereken şey, XML biçimindeki veri kümesinde bulunan elemanların özellik ve dizilişlerinin standartlaştırılmasıdır.

W3C konsorsiyumu DTD, Schema gibi, XML belgelerinin geçerliliğinin kontrol edilebilmesini sağlayan yeni standartlar geliştirmeye devam ediyor. Bu yazımızda DTD yani Doküman Tip Tanımlama (Document Type Declaration) hakkında bilgiler bulacaksınız.

DOKÜMAN TİP TANIMLAMA - DTD

XML belgeleri içine dahil edilebilen ya da ayrı bir dosya halinde kullanılabilen DTD blokları, XML belgelerinde tam bir denetim sağlarlar. Tüm geçerlilik kuralları DTD içinde tanımlanabilir. DTD belgelerini, farklı kaynaklardan gelen XML belgelerini denetlemek için kullanabilirsiniz.

Bu belgeleri kaynaklara ulaştırıp doğrudan kaynak üzerinde denetleme yaptığınızda size ulaşan XML belgesinin tam olarak istediğiniz gibi olmasını sağlayabilirsiniz.

İş ortaklarınızla XML biçiminde veri alışverişi yaparken hangi etiketlerin, hangi sıralamada kullanılacağını ortağınızla beraber belirlersiniz. Hangi elementin ve özniteliğin hangi sırada olacağı, boş değer verilip verilemeyeceği gibi birçok kural DTD belgelerinde (ve DTD bloklarında) tanımlanır.

DTD, XML belgesinin haritası olarak kabul edilir ve kurallara uygun belgeler hazırlamak için DTD dosyası tek başına yeterlidir.

Peki standart XML belgeleri oluşturmak ne anlama geliyor? Yukarıda bahsettiğimiz gibi, bilginin XML biçiminde olması, anlaşılır olduğu anlamına gelmez. Etiketlerin diziliş biçiminin ve içerik kurallarının belirlenmiş olması gerekir.

CV BİLGİLERİ İÇİN XML

İş başvurularının yapıldığı sitelerde aşağıdaki gibi bir CV kalıbına uyulduğunda iş arayanlara düşen şey CV'lerini XML biçiminde dosyalayıp gerektiğinde iş başvuru sitelerine göndermek olabilir.

<CV>
   <AD>Lale</AD>
   <SOYAD>Yılmaz</SOYAD>
   <MESLEK>Yazilim Mühendisi</MESLEK>
   <CINSIYET>Bayan</CINSIYET>
   <SEHIR>Istanbul</SEHIR>
   <TELEFON>0216 612 ...</TELEFON>
   <EMAIL>laleyilmaz@deneme.com</EMAIL>
   <WEB>http://www.chip.com.tr/xml</WEB>
   <DIL>Ingilizce, Almanca</DIL>
   <EGITIM>
      <OKUL TUR="Üniversite">
         <OKULADI>Uludag Üniversitesi</OKULADI>
         <BOLUM>Bilgisayar Mühendisligi</BOLUM>
      </OKUL>
      <OKUL TUR="Lise">
         <OKULADI>Isik Lisesi</OKULADI>
         <BOLUM>Matematik</BOLUM>
      </OKUL>
   </EGITIM>
</CV>

Yukarıdaki başlıklar bir CV için yeterli olmayıp, herkesin benimseyeceği bir standart olarak kabul edilebilir gözükmüyor.

XML standartlarını geliştirmek kolay iş değil. Bundan daha zoru bunları kabul ettirmektir. Bu yüzden belli konsorsiyumlar kurulmuş ve dünyadaki geliştiriciler bu konsorsiyumların kurallarına uymayı kabul ediyorlar.

Bir CV şablonunun uluslararası alanda kabul görmesi için öncelikle İngilizce olması ve de tüm meslek dalları için kullanılabilir olması gerekiyor.

GEÇERLİLİK KURALLARINI DTD İLE TANIMLAYIN

DTD kurallarını XML belgesinin içine dahil edebilir ya da ayrı bir dosyada tutup, bu dosyayı XML belgesinin içine bağlayabilirsiniz.

<?xml version="1.0"?>

<!DOCTYPE CV SYSTEM "cv.dtd">

<CV>
  ..
  ..
</CV>

ya da

<?xml version="1.0"?>

<!DOCTYPE CV [
  DTD tanımlamaları buraya yazılacak.
]>

<CV>
  ..
  ..
</CV>

Yukarıdaki örneklerin ilkinde cv.dtd dosyasına başvuru yapılıyor. İkincisinde ise DTD tanımlaması XML belgesi içinde tutuluyor. Dış dosyalarla bağlantısı olmayan bu tür belgeler tek başına işletildikleri için stand-alone şeklinde adlandırılıyorlar.

DOCTYPE bloğu ilk tanım satırı ile kök elementin başlangıcı arasında yer alır. DOCTYPE etiketinden hemen sonra belgedeki kök elementin ismi yazılır. Sonrasında eğer DTD bir dosyada ise SYSTEM etiketi ile birlikte dosyanın yolu yazılır. Aksi halde DTD bloğu köşeli parantezler içine alınarak belgeye doğrudan eklenir.

DTD'ler XML belgelerinin bir nevi haritası olduğuna göre kullanılacak tüm elementler ve öznitelikler sıralı bir şekilde DTD içinde tanımlanıyor.

cv1.xml
cv1.dtd


ELEMENTLERİ TANIMLAMA

Element adı bazı Türkçe kaynaklarda 'öğe' ya da 'eleman' olarak tercüme edilmiştir. Yazılarımızda terimlerin çoğunlukla orjinal hallerini kullanmayı tercih ediyoruz. Aynı şekilde DTD'nin açılımı kimi yerde 'Belge Türü Tanımlama' şeklinde geçebilir.

DTD'deki öncelikli tanımlamalar elementler için yapılır. Bir elementin içeriği boş olmayacaksa ya da alt elementler olacaksa parantez içinde gerekli tanımlamalar yapılır. Element bir değere sahip ise parantez içinde #PCDATA etiketi yer almalı, alt elementler varsa adları parantez içine virgülle ayrılarak yerleştirilmelidir. (PCDATA – Parsed Character Data)

CV bilgimizi tanımlayan DTD bloğu temel olarak aşağıdakine benzerdir.

<!ELEMENT CV (AD, SOYAD, MESLEK, CINSIYET, EGITIM)>

<CV>

  <!ELEMENT AD       (#PCDATA)>

<AD>Lale</AD>

  <!ELEMENT SOYAD    (#PCDATA)>

<SOYAD>Yılmaz</SOYAD>

  <!ELEMENT MESLEK   (#PCDATA)>

<MESLEK>Yazilim Mühendisi</MESLEK>

  <!ELEMENT CINSIYET (#PCDATA)>

<CINSIYET>Bayan</CINSIYET>

  <!ELEMENT EGITIM (OKUL)>

<EGITIM>

    <!ELEMENT OKUL (OKULADI, BOLUM)>

  <OKUL TUR="Üniversite">

      <!ELEMENT OKULADI (#PCDATA)>

    <OKULADI>Uludag Üniv.</OKULADI>

      <!ELEMENT BOLUM   (#PCDATA)>

    <BOLUM>Bilgisayar Müh.</BOLUM>

Gördüğünüz gibi herbir ana elementin parantezleri arasında sadece kendine ait olan birincil alt elementler yer alıyor. Yani bir hiyerarşi sözkonusu. DTD'lerde elementlerin sıralaması önemlidir. Parantez içinde alt element adlarının sırası ile bunların alttaki dizilimleri aynı olmalıdır. XML belgesindeki elementlerin dizilimi de DTD'ye tam olarak uymalıdır.

#PCDATA dışında EMPTY ve ANY türünde iki tanımlama mevcut. EMPTY olarak tanımlanan bir element, XML belgesinde mutlaka boş bırakılmalıdır. ANY olarak tanımlanmış element ise herhangi bir değer alabilir.

<!ELEMENT NOTLAR ANY> 
<!ELEMENT TEST EMPTY> 

EMPTY olarak tanımlanmış bir element XML belgesinde aşağıdaki gibi yer almalıdır.

<TEST/>

ya da

<TEST></TEST>

ANY elementlerin önemli bir özelliği DTD'de tanımlı diğer elementleri içerebiliyor olmalarıdır.

<?xml version="1.0"?>
<!DOCTYPE CV [
  <!ELEMENT CV (AD, SOYAD, MEDENIHALI, NOTLAR)>
    <!ELEMENT AD         (#PCDATA)>
    <!ELEMENT SOYAD      (#PCDATA)>
    <!ELEMENT MEDENIHALI (#PCDATA)>
    <!ELEMENT NOTLAR     ANY>
]>
<CV>
  <AD>Lale</AD>
  <SOYAD>Yıldırım</SOYAD>
  <MEDENIHALI>Evli</MEDENIHALI>
  <NOTLAR>
    Soyadı ve medeni hali değişti.
    Eskisi şu şekildeydi:
    <MEDENIHALI>Bekar</MEDENIHALI>
    <SOYAD>Yılmaz</SOYAD>
</NOTLAR>
</CV>

ANY türündeki NOTLAR elementinin içinde kullanabileceğimiz alt elementler belgede daha önce tanımlıydı.

any_deneme.xml


ÇOĞUL VE SEÇİME BAĞLI ELEMENTLER

Yazının başında CV örneğindeki OKUL elementinin birden fazla yer aldığına bakın. DTD'de çoğul elementleri belirtmek için aslında özel işaretler gerekiyor. Yani ilk CV örneğinin aşağısındaki DTD bloğu aslında yeterli değildir.

DTD'lerde elementlerin adetleri ile alakalı üç temel kural tanımlı olup bunlar için belli işaretler kullanılıyor.

İşaret

Açıklama

En az

En çok

+

Kesinlikle kullanılmalı

1

Sonsuz

*

İstenildiği kadar

0

Sonsuz

?

Bir kez ya da hiç

0

1

Çoğullukla ilgili kuralları tanımlamadanrken XML belgesinde hangi elementlerin birden fazla kullanılabileceğine, hangilerinin isteğe bağlı olduğuna karar vermelisiniz. Örneğin bir CV belgesinde OKUL bilgisi en az bir kez tanımlı olmalıdır (+). Zira en az bir okulda okumuş olmak bir zorunluluktur.

Daha önce iş deneyimi olmayan kişiler için * türünde bir ISDENEYIMI, e-mail adresi olmayan kişiler için de en fazla bir e-mail adresi yazabilecekleri ? türünde EMAIL adlı elementleri CV şablonunuza ekleyebilirsiniz.

cv2.xml

<?xml version="1.0"?>
<!DOCTYPE CV [
  <!ELEMENT CV (AD, SOYAD, CINSIYET, SEHIR, TELEFON+, EMAIL?, WEB*, DIL*, EGITIM)>

  <!ELEMENT AD       (#PCDATA)>
  <!ELEMENT SOYAD    (#PCDATA)>
  <!ELEMENT CINSIYET (#PCDATA)>
  <!ELEMENT SEHIR    (#PCDATA)>
  <!ELEMENT TELEFON  (#PCDATA)>
  <!ELEMENT EMAIL    (#PCDATA)>
  <!ELEMENT WEB      (#PCDATA)>
  <!ELEMENT DIL      (#PCDATA)>
  <!ELEMENT EGITIM (OKUL+)>
    <!ELEMENT OKUL (OKULTUR, OKULADI, BOLUM)>
      <!ELEMENT OKULTUR  (#PCDATA)>
      <!ELEMENT OKULADI  (#PCDATA)>
      <!ELEMENT BOLUM    (#PCDATA)>
]>
<CV>
  <AD>Lale</AD>
  <SOYAD>Yılmaz</SOYAD>
  <CINSIYET>Bayan</CINSIYET>
  <SEHIR>Istanbul</SEHIR>
  <TELEFON>0216 612 ...</TELEFON>
  <EMAIL>laleyilmaz@deneme.com</EMAIL>
  <WEB>http://www.chip.com.tr/xml</WEB>
  <WEB>http://www.xmlcv.org</WEB>
  <DIL>Ingilizce</DIL>
  <DIL>Almanca</DIL>
  <EGITIM>
    <OKUL>
      <OKULTUR>Üniversite</OKULTUR>
      <OKULADI>Uludag Üniversitesi</OKULADI>
      <BOLUM>Bilgisayar Mühendisligi</BOLUM>
    </OKUL>
    <OKUL>
      <OKULTUR>Lise</OKULTUR>
      <OKULADI>Isik Lisesi</OKULADI>
      <BOLUM>Matematik</BOLUM>
    </OKUL>
  </EGITIM>
</CV>

Bu üç işaretin kullanılmadığı durumlarda elementler mutlaka ve yalnız bir kez kullanılmalıdır. Fakat elementin adı yazılıp içeriği boş bırakılabilir.

Elementler kendi içlerinde yukarıdaki gibi çoğul ya da seçimlik olarak tanımlanabiliyorlar. Bununla birlikte elementleri diğerleriyle birlikte çoğullamak ya da seçime bağlı kılmak mümkündür. İş başvurusu yapılan pozisyonlarla ilgili farklı başlıklar seçtirmeyi düşündüğünüzde bu yöntemi kullanmak isteyebilirsiniz. YAZILIM, TEKNIK_SERVIS, MUHASEBE, IDARI, PAZARLAMA gibi başlıklar olduğunu varsayarsak bunların sadece birine başvuru yapmak gerekir. Bu gibi seçimlik alan adları parantez içine alınıp '|' işareti (ascii 124) ile ayrılırlar. Buradaki temel kural alt elementlerin yalnızca bir tanesinin var olabileceğidir.

<!ELEMENT POZİSYON (YAZILIM | TEKNIK_SERVIS | MUHASEBE)>
  <!ELEMENT YAZILIM (PROGRAMLAMA_DILLERI, INTERNET_BILGISI, ..)
    ..
  <!ELEMENT TEKNIK_SERVIS (DONANIM_BILGISI, ISLETIM_SISTEMLERI, NETWORK_BILGISI, ..)
    ..
  <!ELEMENT MUHASEBE (MUHASEBE_PROGRAMLARI, OFFICE_BILGISI, ..)
    ..

Yukarıdaki örnekte YAZILIM, TEKNIK_SERVIS ya da MUHASEBE elementlerinden yalnız biri kullanılmalıdır. Fakat elementlerin tanımlamasında kullanılan çoğullukla ilgili üç işareti gruplandırılmış elementlerde de kullanabilirsiniz. Bunun için parantez sonlarına bu işaretleri yerleştirmek yeterlidir. Bu durumda ardarda dilediğiniz kadar grubu tekrarlayabilirsiniz.

<!ELEMENT POZİSYON (YAZILIM | TEKNIK_SERVIS | MUHASEBE)*>

Yukarıdaki gibi bir tanımlama yaptığınızda aşağıdakine benzer XML blokları kullanabilirsiniz.

  <POZİSYON>Pozisyon1</POZİSYON> Ardışık bloklar
    <YAZILIM>test</YAZILIM> birinci blok
    <YAZILIM>test</YAZILIM> ikinci blok
    <TEKNIK_SERVIS>test</TEKNIK_SERVIS> üçüncü blok

POZİSYON elementinin tanımlamasında * işareti kullanılmasaydı yalnızca bir element yerleştirilebilecekti. Bu işaret elementin sınırsız sayıda oluşturulabilmesine olanak sağlıyor.

Aynı şeyi seçimlik olmayan (yani virgülle ayrılmış) element adlarına uyguladığımızda ardışık herbir bloğu eksiksiz oluşturmamız gerekir.

<!ELEMENT POZİSYON (YAZILIM, TEKNIK_SERVIS, MUHASEBE)*>

  <POZİSYON>Pozisyon1</POZİSYON> Ardışık bloklar
    <YAZILIM>test</YAZILIM>
    <TEKNIK_SERVIS>test</TEKNIK_SERVIS>
    <MUHASEBE>test</MUHASEBE>
birinci blok
    <YAZILIM>test2</YAZILIM>
    <TEKNIK_SERVIS>test2</TEKNIK_SERVIS>
    <MUHASEBE>test2</MUHASEBE>
ikinci blok
    <YAZILIM>test3</YAZILIM>
    <TEKNIK_SERVIS>test3</TEKNIK_SERVIS>
    <MUHASEBE>test3</MUHASEBE>
üçüncü blok

Gruplandırılmış elementler için yıldız (*) dışında (+) ve (?) işaretlerini kullanabilirsiniz. Bu işaretlerin elementler için oluşturduğu kurallar burada da geçerlidir.

XML belgelerinde olduğu gibi DTD bloklarında da açıklama metinleri kullanılabilir. <!-- ve --> ayıraçları arasında kalan kısımlar açıklama olarak kabul edilir ve belge üzerinde işlemler ve denetlemeler yapılırken bu bölümler dikkate alınmaz. Ekteki cv2.xml dosyasını inceleyebilirsiniz.

BELGENİN GEÇERLİLİĞİNİ KOD İLE DENETLEYİN

XML belgelerinin geçerliliği iki şekilde tanımlanır. Bir XML belgesinin geçerli (valid) olması DTD'de (ya da schema) tanımlı kurallar kümesine uygun olduğu anlamına gelir. Bunun dışında XML belgesinin tek başına temel XML kurallarına uyup uymadığı da sözkonusudur. Belgenin temel XML kurallarına uyması iyi oluşumluluktur (well-formed). Buradan "geçerli" olan bir belgenin mutlaka "iyi oluşumlu" olduğu sonucunu çıkarabilirsiniz.

DTD (schema vs.) dosyası tanımlanmadığı durumlarda belgenin geçerli olması iyi oluşumlu olmasına bağlıdır.

XML belgeninin geçerli olup olmadığını denemek için birkaç yöntem mevcut. XML Nodepad programı bunlardan biridir. Belgenin açılışında geçerli olup olmadığı kontrol edilir ve hata varsa resimdeki gibi açıklayıcı bir ileti görüntülenir.

İkinci yol ise bu ay Marjinal köşesi için hazırladığımız Chip IE Extensions modülünü bilgisayarınıza kurmak. CD'de verdiğimiz dosyaları gerekli şekilde çalıştırarak Internet Explorer'a XML denetleme özelliği kazandırabilirsiniz.

XML belgelerinin geçerliliğini denetleme dışında, biçimlendirilmiş XML çıktısını gösterme gibi özellikler de Internet Explorer'ın sağ tuş menüsüne yerleşiyor.

Bunların dışında XML belgelerinin geçerliliğini kod ile denetlemek istediğinizde DOMDocument nesnesini kullanabilirsiniz.

  Dim dom
  Set dom = CreateObject("MSXML2.DOMDocument.4.0")
  
  dom.async = False
  dom.validateOnParse = True
  dom.resolveExternals = True
  If dom.Load("C:\cv_ornek1.xml") Then
    '''MsgBox "Belge geçerli."
    Response.Write "Belge geçerli."
  Else
    MsgBox "HATA OLUSTU: Belge geçerli degil." & vbCr & vbCr & _
      "DOSYA=" & dom.parseError.url & vbCr & _
      "SATIR=" & dom.parseError.Line & vbCr & _
      "SÜTUN=" & dom.parseError.linepos & vbCr & _
      "METIN=" & dom.parseError.srcText & vbCr & _
      "HATA=" & dom.parseError.reason & vbCr
  End If

DOMDocument'e ait ParseError nesnesi ile çözümleme (parse) işlemindeki hatanın kaçıncı satır ve sütunda olduğunu öğrenebiliyoruz. Yükleme anında belgenin otomatik olarak denetlenmesi için Load eyleminden önce ValidateOnParse ve ResolveExternals özelliklerini True olarak ayarlamak gerekiyor.

 

DOSYALAR:
cv1.xml
cv2.xml
cv1.dtd
any_deneme.xml


Serkan ŞAHİNOĞLU
(Chip Dergisi, Mayıs 2002)


http://BilgiTeknoloji.net