XML Scheme Kompleks Elemanlar ve Veri Tipleri
XSD ile Kompleks Elemanlar ve Veri Tipleri nasıl tanımlanır.
Nasıl kompleks eleman tanımlarız?
<kitap>
<adi>Yunus Emre Divanı</adi>
<dil>Türkçe</dil>
</kitap>
Kompleks eleman tanımlamanın iki yolu var.
<xs:element name="kitap">
<xs:complextype>
<xs:sequence>
<xs:element name="adi" type="xs:string"/>
<xs:element name="dil" type="xs:string"/>
</xs:sequence>
</xs:complextype>
</xs:element>
İlk yöntemimizde elemanın içinde tanımlayabiliriz.
Elemanın yapısı kendisine özgü ve başka yerde kullanılmayacağını düşünüyorsanız böyle tanımlayabilirisiniz.
Eğer oluşturulan yapının bir çok elemanda kullanılacağını düşünüyorsanız ikinci yöntemi tavsiye ediyorum;
<xs:element name="kitap" type="kitapGiris"/>
<xs:element name="kitapHakkinda" type="kitapGiris"/>
<!-- Bir veya birden çok eleman için tanımlayabilirsiniz. -->
<xs:complextype name="kitapGiris">
<xs:sequence>
<xs:element name="adi" type="xs:string"/>
<xs:element name="dil" type="xs:string"/>
</xs:sequence>
</xs:complextype>
Oluşturulan Kompleks Tipe harici olarak başka bir tipin özelliklerini dahil edebilirsiniz. Bundan sonraki örneklerde genellikle ikinci yöntemi kullanacağım.
<xs:element name="kitap" type="kitapGiris"/>
<xs:element name="kitapHakkinda" type="kitapHakkinda"/>
<!-- Bir veya birden çok eleman için tanımlayabilirsiniz. -->
<xs:complextype name="kitapGiris">
<xs:sequence>
<xs:element name="adi" type="xs:string"/>
<xs:element name="dil" type="xs:string"/>
</xs:sequence>
</xs:complextype>
<xs:complextype name="kitapHakkinda">
<xs:complexcontent>
<xs:extension base="kitapGiris">
<xs:sequence>
<xs:element name="yazar" type="xs:string"/>
<xs:element name="isbn" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexcontent>
</xs:complextype>
Boş Elemanlar
<kitap isbn="9759954949"/>
Elemanı kompleks şekilde tanımlamak için;
<xs:element name="kitap" type="kitapGiris"/>
<xs:complextype name="kitapGiris">
<xs:attribute name="isbn" type="xs:positiveInteger"/>
</xs:complextype>
"kitap" elemanına sadece isbn tanımlayabilirsiniz.
Sadece Eleman
<kitap>
<adi>Yunus Emre Divanı</adi>
<dil>Türkçe</dil>
</kitap>
Xml örnek alırsak ve Kompleks bir şekilde tanımlarsak.
<xs:element name="kitap" type="kitapYapi"/>
<xs:complextype name="kitapYapi">
<xs:sequence>
<xs:element name="adi" type="xs:string"/>
<xs:element name="dil" type="xs:string"/>
</xs:sequence>
</xs:complextype>
Sadece Metin İçerik
<kitap isbn="9759954949">Yunus Emre Divanı</kitap>
Tanımlanan kitap elemanın içeriğinin sadece metin olarak tanımlamak için.
<xs:element name="kitap" type="kitapYapi"/>
<xs:complextype name="kitapYapi">
<xs:simplecontent>
<xs:extension base="xs:string">
<xs:attribute name="isbn" type="xs:positiveInteger" />
</xs:extension>
</xs:simplecontent>
</xs:complextype>
Karışık İçerik
<kitap>
Kitap Adı : <adi>Yunus Emre Divanı</adi>
Dil : <dil>Türkçe</dil>
ISBN : <isbn>9759954949</isbn>
</kitap>
İçeriği karışık elemanlar için aşağıdaki şekilde tanımlarız.
<xs:element name="kitap" type="kitapYapi"/>
<xs:complextype mixed="true" name="kitapYapi">
<xs:sequence>
<xs:element name="adi" type="xs:string"/>
<xs:element name="dil" type="xs:string"/>
<xs:element name="isbn" type="xs:positiveInteger"/>
</xs:sequence>
</xs:complextype>
Göstergeler
<all> içinde her düzen içinde kullanılır, bir adet çocuk eleman olması gerekir.
<xs:complextype mixed="true" name="kitapYapi">
<xs:all>
<xs:element name="adi" type="xs:string"/>
<xs:element name="dil" type="xs:string"/>
<xs:element name="isbn" type="xs:positiveInteger"/>
</xs:all>
</xs:complextype>
<choice> bir ve birden fazla çocuk eleman kullanılabilir.
<xs:complextype mixed="true" name="kitapYapi">
<xs:choice>
<xs:element name="adi" type="xs:string"/>
<xs:element name="dil" type="xs:string"/>
<xs:element name="isbn" type="xs:positiveInteger"/>
</xs:choice>
</xs:complextype>
<sequence> düzen içerisinde kullanılması zorunludur.
<xs:complextype mixed="true" name="kitapYapi">
<xs:sequence>
<xs:element name="adi" type="xs:string"/>
<xs:element name="dil" type="xs:string"/>
<xs:element name="isbn" type="xs:positiveInteger"/>
</xs:sequence>
</xs:complextype>
<maxOccurs> : çocuk olan elemanın maksimum kaç defa kullanılabileceğini belirliyorsun <minOccurs> : çocuk olan elemanın minimum kaç defa kullanılabileceğini belirliyorsun.
<xs:complextype mixed="true" name="kitapYapi">
<xs:sequence>
<xs:element name="adi" type="xs:string"/>
<xs:element name="dil" type="xs:string" maxOccurs="10" minOccurs="1"/>
</xs:sequence>
</xs:complextype>
Yukarıda dil elemanından minimum 1 tane olması gerektiğini ve maksimumda 10 tane olabileceğini belirledim <group> grup oluşturarak bunu bir çok elemenda kullanabilirsiniz. Aynı zamanda yukarıdaki göstergelerin hepsini grup içerisinde kullanabilirsiniz.
<xs:group name="kitapGrup">
<xs:sequence>
<xs:element name="adi" type="xs:string"/>
<xs:element name="dil" type="xs:string"/>
</xs:sequence>
</xs:group>
<xs:element name="kitap" type="kitapGiris"/>
<xs:complextype name="kitapGiris">
<xs:sequence>
<xs:group ref="kitapGrup"/>
<xs:element name="isbn" type="xs:positiveInteger"/>
</xs:sequence>
</xs:complextype>
Aynı olay <attributeGroup> içinde geçerlidir.
<xs:attributegroup name="kitapEtiket">
<xs:attribute name="isbn" type="xs:positiveInteger"/>
</xs:attributegroup>
<xs:element name="kitap" type="kitapGiris"/>
<xs:complextype name="kitapGiris">
<xs:sequence>
<xs:attributeGroup ref="kitapEtiket"/>
<xs:element name="isbn" type="xs:positiveInteger"/>
</xs:sequence>
</xs:complextype>
<any> elemanı genişletmek için kullanırız. Aşağıdaki örnekte bir sonraki elemanı istediğimiz gibi tanımlayabiliriz.
<xs:complextype name="kitapYapi">
<xs:sequence>
<xs:element name="adi" type="xs:string"/>
<xs:element name="dil" type="xs:string"/>
<xs:any minOccurs="0"/>
</xs:sequence>
</xs:complextype>
<anyAttribute> ise etiketleri genişletmek için kullanırız.
<xs:complextype name="kitapYapi">
<xs:sequence>
<xs:element name="adi" type="xs:string"/>
<xs:element name="dil" type="xs:string"/>
<xs:anyAttribute/>
</xs:sequence>
</xs:complextype>
"\substitutionGroup" başka bir elemanın yerine geçmesi için yazarız.
<xs:element name="kitap" type="xs:string"/>
<xs:element name="adi" substitutionGroup="kitap"/>
<!-- XML Tanımlarken -->
<kitap>Yunus Emre Divanı</kitap>
<!-- yada -->
<adi>Yunus Emre Divanı</adi>
Şeklinde tanımlayabiliyoruz. Eğer block="substitution" etiket şeklinde kullanırsak yukarıdaki gibi <adi></adi> tanımlaması yapamayız.
Veri Tipleri
Veri tiplerini inceleyeceğiz.
Metin Veri Tipleri
| Veri Tipi | Açıklama |
|---|---|
| ENTITIES | |
| ENTITY | |
| ID | Elemana etiket şeklinde atanmış bir id. |
| IDREF | Elemana etiket şeklinde atanmış bir id. |
| IDREFS | |
| language | Doğrulanmış dil id’si |
| Name | Doğrulanmış isim. |
| NCName | |
| NMTOKEN | Elemana etiket şeklinde atanmış bir id. |
| NMTOKENS | |
| normalizedString | Boşluk, Tab içermeyen metin. |
| QName | |
| string | Metin |
| token | Boşluk, Tab vs içermeyen. |
Tarih Veri Tipleri
| Veri Tipi | Açıklama |
|---|---|
| date | Tarih verisi |
| dateTime | Tarih ve saat verisi |
| duration | İnterval cinsinden veri |
| gDay | Gün (DD) |
| gMonth | Ay (MM) |
| gMonthDay | Ay - Gün (MM-DD) |
| gYear | Yıl (YYYY) |
| gYearMonth | Yıl - Ay (YYYY-MM) |
| time | Saat |
Sayısal Veri Tipleri
| Veri Tipi | Açıklama |
|---|---|
| byte | işaretli 8-bit integer |
| decimal | decimal değer |
| int | işaretli 32-bit integer |
| integer | integer değer |
| long | işaretli 64-bit integer |
| negativeInteger | Negatif değerler (..,-2,-1) |
| nonNegativeInteger | Negatif olmayan değerler (0,1,2,..) |
| nonPositiveInteger | Pozitif olmayan değerler (..,-2,-1,0) |
| positiveInteger | Pozitif değerler (1,2,..) |
| short | işaretli 16-bit integer |
| unsignedLong | işaretsiz 64-bit integer |
| unsignedInt | işaretsiz 32-bit integer |
| unsignedShort | işaretsiz 16-bit integer |
| unsignedByte | işaretsiz 8-bit integer |
Karışık Veri Tipleri
| Veri Tipi | Açıklama |
|---|---|
| anyURI | |
| base64Binary | |
| boolean | |
| double | |
| float | |
| hexBinary | |
| NOTATION | |
| QName |