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 TipiAçıklama
ENTITIES
ENTITY
IDElemana etiket şeklinde atanmış bir id.
IDREFElemana etiket şeklinde atanmış bir id.
IDREFS
languageDoğrulanmış dil id’si
NameDoğrulanmış isim.
NCName
NMTOKENElemana etiket şeklinde atanmış bir id.
NMTOKENS
normalizedStringBoşluk, Tab içermeyen metin.
QName
stringMetin
tokenBoşluk, Tab vs içermeyen.

Tarih Veri Tipleri

Veri TipiAçıklama
dateTarih verisi
dateTimeTarih ve saat verisi
durationİnterval cinsinden veri
gDayGün (DD)
gMonthAy (MM)
gMonthDayAy - Gün (MM-DD)
gYearYıl (YYYY)
gYearMonthYıl - Ay (YYYY-MM)
timeSaat

Sayısal Veri Tipleri

Veri TipiAçıklama
byteişaretli 8-bit integer
decimaldecimal değer
intişaretli 32-bit integer
integerinteger değer
longişaretli 64-bit integer
negativeIntegerNegatif değerler (..,-2,-1)
nonNegativeIntegerNegatif olmayan değerler (0,1,2,..)
nonPositiveIntegerPozitif olmayan değerler (..,-2,-1,0)
positiveIntegerPozitif değerler (1,2,..)
shortişaretli 16-bit integer
unsignedLongişaretsiz 64-bit integer
unsignedIntişaretsiz 32-bit integer
unsignedShortişaretsiz 16-bit integer
unsignedByteişaretsiz 8-bit integer

Karışık Veri Tipleri

Veri TipiAçıklama
anyURI
base64Binary
boolean
double
float
hexBinary
NOTATION
QName