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
 

Şemalarda Karmaşık Tipler


Şemalar karmaşık XML belgelerini tanımlayabilecek özelliklere sahiptir. Sıralı veri alanları içeren basit veri tabloları tanımlamanın ötesinde, karmaşık bir veri ağacını anlaşılır şekilde tanımlamak xml şemalarının en önemli özelliklerindendir.

  • Karmaşık Tipler Tanımlamak
  • Yuvalanmış Öğeleri Sıralamak
  • Öznitelikleri Tanımlamak
  • Öğe ve Öznitelikler İçin Öndeğer Bildirmek
  • Öğe ve Öznitelik Grupları Tanımlamak
  • Liste Tipleri Oluşturmak
     

KARMAŞIK TİPLER TANIMLAMAK

Karmaşık öğeler içeriğin türüne göre birkaç şekilde tanımlanmaktadır. Alt öğe içeren ya da öznitelik içeren öğeler karmaşık olarak kabul edilir. Bununla birlikte hem metin, hem de alt öğe içerebilen karma içerikli öğeler de tanımlanabilir.

Genel bir karmaşık öğe tanımlaması <xsd:complexType> ile başlar ve sonrasında sıralı grup tanımlayıcısı gerektirir. Alt öğe içeren bir öğe aşağıdakine benzer şekilde tanımlanır.

<xsd:element name="karmaşıköğe1">
 <xsd:complexType>
  <xsd:sequence>
   <xsd:element name="altöğe1" .. />
   <xsd:element name="altöğe2" .. />
  </xsd:sequence>
 </xsd:complexType>
</xsd:element>

ya da

<xsd:complexType name="karmaşıktip1">
 <xsd:sequence>
  <xsd:element name="altöğe1" .. />
  <xsd:element name="altöğe2" .. />
 </xsd:sequence>
</xsd:complexType>

<xsd:element name="karmaşıköğe1" type="karmaşıktip1">

Birinci örnekte karmaşık öğe kendi tip tanımını içeriyor. İkinci örnekte ise tip tanımı oluşturulup karmaşık öğe bu tipe bağlanıyor.

Her iki durum için de öğe xml belgesi aşağıdaki şekilde olmalıdır.

<karmaşıköğe1>
 <altöğe1>...</altöğe1>
 <altöğe2>...</altöğe2>
</karmaşıköğe1>

YUVALANMIŞ ÖĞELERİ SIRALAMAK

Alt öğeler tanımlanırken öğe tanımlamasına geçmeden önce bir sıralı grup tanımlayıcısı ya da diğer birkaç tanımlayıcıdan birini eklemek gerekir.

Sıralı öğe grubu tanımlayıcıları choice, all ve sequence'dir. Her üçü de complexType'den hemen sonra başlar ve içeride öğe tanımları bulunmakla birlikte alt gruplar da bulunabilir.

Sıralı bir tam liste için xsd:sequence'yi aşağıdaki gibi kullanmak gerekir.

<xsd:complexType>
 <xsd:sequence>
  <xsd:element name="altöğe1" .. />
  <xsd:element name="altöğe2" .. />
  <xsd:element name="altöğe3" .. />
 </xsd:sequence>
</xsd:complexType>

Sequence içerideki öğelerin tümünün aynı sırada yer alması gerektiğini işaret eder. All da içerideki tüm öğelerin kullanılması gerektiğini fakat sıralamanın önemli olmadığını ifade eder.

Choice ise içerideki öğelerden yalnızca birinin kullanılması şartını getirir.

<xsd:complexType>
 <xsd:choice>
  <xsd:element name="altöğe1" .. />
  <xsd:element name="altöğe2" .. />
  <xsd:element name="altöğe3" .. />
 </xsd:choice>
</xsd:complexType>

Bu şekilde olduğunda öğe içinde üç alt öğeden yalnızca biri yer alabilir.

<karmaşıköğe1>
 <altöğe2>...</altöğe2>
</karmaşıköğe1>

Grup tanımlayıcılarını içiçe kullanmak mümkündür. Bu işlem DTD'deki parantez içine alınmış alt öğe adlarının çoğulluk (seçimlik) işaretçileri ile tanımlanmasına benzer.

<xsd:complexType name="KARMAŞIK_TİP ">
 <xsd:choice>
  <xsd:element name="ÖĞE1" type=".."/>
  <xsd:element name="ÖĞE2" type=".."/>
  <xsd:sequence>
   <xsd:element name="ÖĞE3" type=".."/>
   <xsd:element name="ÖĞE4" type=".."/>
   <xsd:element name="ÖĞE5" type=".."/>
  </xsd:sequence>
</xsd:choice>
</xsd:complexType>

Choice'nin alt kademedekilerden yalnızca birini, sequence'nin ise alt kademedekilerin tümünü aynı sırada gerektirdiğini hatırlayın. Yukarıdaki örnek yalnızca ÖĞE1, ÖĞE2 ya da sequence bölgesinin tamamının kullanılması zorunludur.

Şu durumda bu örnek için mümkün olan yalnızca üç seçenek vardır.

<ÖĞE1>..<ÖĞE1>

ya da

<ÖĞE2>..<ÖĞE2>

ya da

<ÖĞE3>..<ÖĞE3>
<ÖĞE4>..<ÖĞE4>
<ÖĞE5>..<ÖĞE5>

ÖZNİTELİKLERİ TANIMLAMAK

Özniteliğe sahip bir öğe karmaşık olarak nitelendirilir. Karmaşık bir öğe içinde bir öznitelik aşağıdaki şekilde tanımlanır.

<xsd:element name="KISI">
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element name="AD" type="xsd:string"/>
      <xsd:element name="SOYAD" type="xsd:string"/>
    </xsd:sequence>
    <xsd:attribute name="cinsiyet" type="xsd:string"/>
  </xsd:complexType>
</xsd:element>

Öznitelikler xsd:attibute ile başlar ve genelde name ve type değerine sahiptirler ve tip bulunduğu dal içerisinde son sıralarda yer almalıdır. Yukarıdaki örnekte cinsiyet özniteliği genel metin bilgisi içerecek şekilde tanımlandı.

<KISI cinsiyet="Erkek">
  <AD>Ali</AD>
  <SOYAD>Veli</SOYAD>
</KISI>

Öznitelikler aslında yalnızca metin bilgisi alabilir. Bu, sayı, tarih biçiminde ya da türetilmiş bir basit tip de olabilse de içerik her zaman tırnak içinde yazılan bir metin bilgisidir.

Öğelerde olduğu gibi öznitelikler için de adlandırılmış tipler oluşturulabilir ve kısıtlama seçenekleri öznitelikler için de benzer şekilde belirtilir.

<xsd:attribute name="öznitelik_tipi1">
 <xsd:simpleType>
  <xsd:restriction base="xsd:integer">
   <xsd:minInclusive value="1000"/>
  </xsd:restriction>
 </xsd:simpleType>
</xsd:attribute>

<xsd:complexType name="karmaşık_tip">
  <xsd:attribute ref="öznitelik_tipi1"/>
</xsd:complexType>

Öznitelikler basit tipte olduğu için ikinci satırda xsd:simpleType kullanıldığına ve adlandırılmış özniteliği belirtmek için ref kullanıldığına dikkat edin.

Örnekte öznitelik_tip1 adlı öznitelik tipi 1000'den büyük bir tamsayı olarak ayarlandı. Bu öznitelik karmaşık tipte kullanılırken tip tanımına ref ile başvuru yapıldı.

Öznitelikler özel olarak belirtilmediyse kullanımı tercihe bağlıdır. Bir özniteliğin kullanılmasını zorunlu kılmak ise use özelliği ile mümkündür.

Use özelliği "required" olduğunda öznitelik xml belgesinde mutlaka var olmalıdır. Bu özelliğin değeri varsayılan olarak "optional"dır. Yani xml belgesinde öznitelikleri tanımlamak geçerli olarak zorunlu değildir.

<xs:attribute name="öznitelik1" type="xs:string" use="required"/>


ÖĞE VE ÖZNİTELİKLER İÇİN ÖNDEĞER BİLDİRMEK

Öğe ve öznitelikler her zaman XML belgesinde yer almayabilir. Bu gibi durumlarda geçerli öndeğerler atamak düzenlemeyi nispeten kolaylaştırır.

Hem öğe hem de öznitelikler için default ve fixed özellikleri öndeğer atanmasını sağlar. Default özelliği, öğe belgede bulunmadığında öğe varmış gibi ona değer yükler. Fixed ise sabitlenmiş bir değer atar ve öğe bu değerden başkasına sahip olamaz. Öğe yoksa değer atanmaz.

Hem öğe hem de öznitelikler için öndeğerler benzer şekilde bildiriliyor.

<xsd:attribute name="cinsiyet" type="xsd:string" default="bayan"/>
<xsd:attribute name="cinsiyet" type="xsd:string" fixed="bayan"/>

<xsd:element name="ÜLKE" type="xsd:string" default="Türkiye"/>
<xsd:element name="ÜLKE" type="xsd:string" fixed="Türkiye"/>

Ülke öğesi belgede yer almıyorsa, Default ile öğe Türkiye değeri ile yer alıyormuş gibi kabul edilir. Öğe ilk durumda mevcutsa değerini değiştirmeye zorlamaz.

Default ya da fixed’i birlikte kullanmamak gerekir.

ÖĞE VE ÖZNİTELİK GRUPLARI TANIMLAMAK

Bir öğe veya öznitelik serisinin belgede çokça kullanıldığı durumlarda, bunları grup haline getirip bunlara başvuruda bulunmak şemayı biraz kısaltıp daha anlaşılır hale getirebilir. Aşağıda xsd:group bölümü grup adlı grubu oluşturuyor.

<xsd:schema>

<xsd:group name="grup">
 <xsd:sequence>
  <xsd:element name="öğe1" type="xsd:string"/>
  <xsd:element name="öğe2" type="xsd:string"/>
  <xsd:element name="öğe3" type="xsd:string"/>
 </xsd:sequence>
</xsd:group>

...

<xsd:element name="genel1">
 <xsd:sequence>
  ..
  <xsd:group ref="grup"/>
  ..
 </xsd:sequence>
 
</xsd:element>

<xsd:element name="genel2">
 <xsd:sequence>
  ..
  <xsd:group ref="grup"/>
  ..
 </xsd:sequence>
</xsd:element>

...

</xsd:schema>

Grup bölgesini uygun yerlerde birden çok kez kullanmak mümkündür. Tabii buradaki xsd:grup ile yalnızca öğe grubu tanımlandığını unutmayın. Öznitelikler xsd:attributeGroup ile tanımlanmaktadır ve öğe grubuna benzer şekilde kullanılırlar.

<xsd:attributeGroup name="öznitelikgrubu1">
  <xsd:attribute ...
  <xsd:attribute ...
</xsd:attributeGroup>  

...

<xsd:attributeGroup ref="öznitelikgrubu1">

Grup tanımları belgede en üst seviyede yer alır. Gruplara karmaşık tip tanımlamalarında, dizilerde, tercih kümelerinde ve diğer gruplar içinde başvuru yapılabilir.
 

LİSTE TİPLERİ OLUŞTURMAK

Bilgilerin ardarda sıralı yazılması gerektiği durumlar için şemalarda liste tanımları oluşturulabilmektedir. Listeler basit tipteki bilgilerin boşluklar ayrılıp yanyana yazılmasıyla oluşur ve tüm bilgi yalnızca bir öğeye ait olur. Bu kalabalık bir bilginin üyelerine topluca ulaşmak gerektiği durumlar için faydalıdır. Çeşitli numaraların, tarihlerin, kısa adların, anahtar sözcüklerin yanyana yazılması gerektiği durumlar gibi...

<xsd:simpleType name="tarih_liste_tip">
  <xsd:list base="xsd:date"/>
</xsd:simpleType>

Tarih_liste_tip tipi tarih bilgileri içeren düz bir listeyi ifade eder. Bu tipi kullanacak öğeyi tanımlamaksa öncekilerden farklı değildir.

<xsd:element name="TarihListesi" type="tarih_liste_tip"/>

Bu durumda TarihListesi öğesi xml belgesinde aşağıdaki gibi yer almalıdır.

<TarihListesi>1923-10-29 2023-10-29 .. </TarihListesi>

Sıfır ya da çok sayıda değer boşlukla ayrılacak şekilde bu öğe içine yerleştirilebilir.

Kısıtlama gerektiği durumlarda xsd:list içinde çeşitli kısıtlama koşulları kullanılabilir. Yukarıdaki tip tanımını aşağıdaki gibi düzenlediğinizde TarihListesi bilgisine en çok 5 tarih ekleyebilirsiniz.

<xsd:simpleType name="tarih_liste_tip">
 <xsd:list base="xsd:date">
  <xsd:length value="5"/>
 </xsd:list>
</xsd:simpleType>

Liste tiplerini kısıtlamak için length, maxLength, minLength, enumeration gibi koşullar kullanılabilir.
 

DOSYALAR:
ozgecmis.xml
ozgecmis.xsd

 
Serkan ŞAHİNOĞLU
(Chip Dergisi, Mart 2003)


http://BilgiTeknoloji.net