Bir XSD Örneği
- Önceki Sayfa XSD Eleman Değişimi
- Sonraki Sayfa XSD Dizgi
Bu bölümde XML Schema yazmayı nasıl yazacağınızı göstereceğiz. Ayrıca schema yazmanın farklı yöntemlerini de öğreneceksiniz.
XML belgesi
Bu adlı "shiporder.xml" XML belgesini inceleyelim:
<?xml version="1.0" encoding="ISO-8859-1"?> <shiporder orderid="889923"> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="shiporder.xsd"> <orderperson>George Bush</orderperson> <shipto> <name>John Adams</name> <address>Oxford Street</address> <city>London</city> <country>UK</country> </shipto> <item> <title>Empire Burlesque</title> <note>Special Edition</note> <quantity>1</quantity> <price>10.90</price> </item> <item> <title>Hide your heart</title> <quantity>1</quantity> <price>9.90</price> </item> </shiporder>
Yukarıdaki XML belgesi "shiporder" adlı kök elementi içerir, bu element "orderid" adında bir özellik içerir. "shiporder" elementi "orderperson"、"shipto" ve "item" adında üç farklı alt element içerir. "item" elementi iki kez ortaya çıkar, "title" adında bir elementi, seçmeli "note" elementi, "quantity" ve "price" elementleri içerir.
Bu satır xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" kullanarak, XML ayrıştırıcıya belgenin belirli bir schema'ya göre doğrulanmasını bildirir. Bu satır: xsi:noNamespaceSchemaLocation="shiporder.xsd" schema'nın konumunu belirler (burada, "shiporder.xml" ile aynı klasörde bulunur).
Bir XML Schema oluşturma
Şimdi, yukarıdaki bu XML belgesi için bir schema oluşturmamız gerekiyor.
Yeni bir dosya açarak ve bu dosyayı "shiporder.xsd" olarak adlandırarak başlayabiliriz. Schema oluşturmak için, sadece bulduğumuz her elementi tanımlamak için XML belgesindeki yapıyı takip etmemiz yeterlidir. Öncelikle, standart bir XML beyanı tanımlamaya başlarız:
<?xml version="1.0" encoding="ISO-8859-1" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> ... ... </xs:schema>
Yukarıdaki schema'da, standart adlandırma alanını (xs) kullandık ve bu adlandırma alanı ile ilişkili URI, Schema dil tanımı (Schema language definition)dır ve standart değeri http://www.w3.org/2001/XMLSchema'dır.
Sonra, "shiporder" elementini tanımlamamız gerekiyor. Bu element, diğer elementleri içeren bir özellik içerir, bu yüzden onu karmaşık tür olarak tanımlıyoruz. "shiporder" elementinin alt elementleri, alt elementlerin sırasını tanımlayan xs:sequence elementi ile çevrilidir:
<xs:element name="shiporder"> <xs:complexType> <xs:sequence> ... ... </xs:sequence> ... </xs:complexType> </xs:element>
Daha sonra, "orderperson" elementini basit tür olarak tanımlamamız gerekiyor (çünkü bu element hiçbir özellik veya diğer elementler içermiyor). Tür (xs:string) ön eki, adlandırma alanının ön eki tarafından belirlenir, bu adlandırma alanı, önceden tanımlanmış schema veri türlerinin XML schema ile ilişkilidir:
<xs:element adı="siparisKişisi" türü="xs:ziyaret"/>
Sonra, iki elementi karmaşık tür olarak tanımlamam gerekiyor: "shipto" ve "item". "shipto" elementini tanımlamaya başlıyoruz:
<xs:element name="shipto"> <xs:complexType> <xs:sequence> <xs:element adı="ad" türü="xs:ziyaret"/> <xs:element adı="adres" türü="xs:ziyaret"/> <xs:element adı="şehir" türü="xs:ziyaret"/> <xs:element adı="ülke" türü="xs:ziyaret"/> </xs:sequence> </xs:complexType> </xs:element>
Schema kullanarak, bir elementin ortaya çıkabileceği sıklığı maxOccurs ve minOccurs özellikleri ile tanımlayabiliriz. maxOccurs, bir elementin ortaya çıkabileceği maksimum sıklığı tanımlar,而minOccurs ise bir elementin ortaya çıkabileceği minimum sıklığını tanımlar. maxOccurs ve minOccurs'ın varsayılan değeri 1'dir!
Şimdi, "item" elementini tanımlayabiliriz. Bu element, "shiporder" elementi içinde birden fazla kez ortaya çıkabilir. Bu, "item" elementinin maxOccurs özelliğinin değerinin "unbounded" olarak ayarlanmasıyla sağlanır, böylece "item" elementi yaratıcının istediği kadar herhangi bir sayıda ortaya çıkabilir. Lütfen dikkat edin, "note" elementi seçmeli bir elementtir. Bu elementin minOccurs özelliği 0 olarak ayarlanmıştır:
<xs:element adı="madde" maxOccurs="sınırsız"> <xs:complexType> <xs:sequence> <xs:element adı="başlık" türü="xs:ziyaret"/> <xs:element adı="not" türü="xs:ziyaret" minOccurs="0"/> <xs:element adı="miktar" türü="xs:pozitifTamsayı"/> <xs:element adı="fiyat" türü="xs:decimal"/> </xs:sequence> </xs:complexType> </xs:element>
Şimdi, "shiporder" elementinin özelliklerini beyan edebiliriz. Bu zorunlu bir özellik olduğu için use="zorunlu" olarak belirtiyoruz.
Açıklama:Bu özelliğin bildirimi, en sona konmalıdır:
<xs:özellik adı="orderid" türü="xs:ziyaret" kullanım="zorunlu"/>
Bu "shiporder.xsd" adlı schema dosyasının belge listesi şu şekildedir:
<?xml version="1.0" encoding="ISO-8859-1" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="shiporder"> <xs:complexType> <xs:sequence> <xs:element adı="siparisKişisi" türü="xs:ziyaret"/> <xs:element name="shipto"> <xs:complexType> <xs:sequence> <xs:element adı="ad" türü="xs:ziyaret"/> <xs:element adı="adres" türü="xs:ziyaret"/> <xs:element adı="şehir" türü="xs:ziyaret"/> <xs:element adı="ülke" türü="xs:ziyaret"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element adı="madde" maxOccurs="sınırsız"> <xs:complexType> <xs:sequence> <xs:element adı="başlık" türü="xs:ziyaret"/> <xs:element adı="not" türü="xs:ziyaret" minOccurs="0"/> <xs:element adı="miktar" türü="xs:pozitifTamsayı"/> <xs:element adı="fiyat" türü="xs:decimal"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> <xs:özellik adı="orderid" türü="xs:ziyaret" kullanım="zorunlu"/> </xs:complexType> </xs:element> </xs:schema>
Schema'yı parçalara ayırma
Önceki tasarım yöntemi oldukça kolaydır, ancak belge karmaşık hale gelince okunması ve bakımı zorlaşır.
Sonraki tasarım yöntemi, önce tüm element ve özellik tanımlarını, ardından ref özelliği kullanarak onları referans almayı içerir.
Bu, yeni yöntemle tasarlanmış schema dosyasıdır:
<?xml version="1.0" encoding="ISO-8859-1" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <!-- Kolay element tanımı --> <xs:element adı="siparisKişisi" türü="xs:ziyaret"/> <xs:element adı="ad" türü="xs:ziyaret"/> <xs:element adı="adres" türü="xs:ziyaret"/> <xs:element adı="şehir" türü="xs:ziyaret"/> <xs:element adı="ülke" türü="xs:ziyaret"/> <xs:element adı="başlık" türü="xs:ziyaret"/> <xs:element adı="not" türü="xs:ziyaret"/> <xs:element adı="miktar" türü="xs:pozitifTamsayı"/> <xs:element adı="fiyat" türü="xs:decimal"/> <!-- özellik tanımı --> <xs:attribute name="orderid" type="xs:string"/> <!-- karmaşık öğenin tanımı --> <xs:element name="shipto"> <xs:complexType> <xs:sequence> <xs:element ref="name"/> <xs:element ref="address"/> <xs:element ref="city"/> <xs:element ref="country"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="item"> <xs:complexType> <xs:sequence> <xs:element ref="title"/> <xs:element ref="note" minOccurs="0"/> <xs:element ref="quantity"/> <xs:element ref="price"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="shiporder"> <xs:complexType> <xs:sequence> <xs:element ref="orderperson"/> <xs:element ref="shipto"/> <xs:element ref="item" maxOccurs="unbounded"/> </xs:sequence> <xs:attribute ref="orderid" use="required"/> </xs:complexType> </xs:element> </xs:schema>
Belirtilen türler (Adlandırılmış Türler) kullanılarak
Üçüncü tasarım yöntemi sınıf veya türleri tanımlar, böylece öğe tanımlarının tekrar kullanılma yeteneğimize sahip olmamızı sağlar. Belirli yöntem şu şekildedir: Öncelikle basit ve karmaşık öğelere adlandırma yapılır, ardından öğelerin type özellikleri aracılığıyla bu öğelere işaret edilir.
Bu şema dosyası ("shiporder.xsd") üçüncü yöntemle tasarlanmıştır:
<?xml version="1.0" encoding="ISO-8859-1" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:simpleType name="stringtype"> <xs:restriction base="xs:string"/> </xs:simpleType> <xs:simpleType name="inttype"> <xs:restriction base="xs:positiveInteger"/> </xs:simpleType> <xs:simpleType name="dectype"> <xs:restriction base="xs:decimal"/> </xs:simpleType> <xs:simpleType name="orderidtype"> <xs:restriction base="xs:string"> <xs:pattern value="[0-9]{6}"/> </xs:restriction> </xs:simpleType> <xs:complexType name="shiptotype"> <xs:sequence> <xs:element name="name" type="stringtype"/> <xs:element name="address" type="stringtype"/> <xs:element name="city" type="stringtype"/> <xs:element name="country" type="stringtype"/> </xs:sequence> </xs:complexType> <xs:complexType name="itemtype"> <xs:sequence> <xs:element name="title" type="stringtype"/> <xs:element name="note" type="stringtype" minOccurs="0"/> <xs:element name="quantity" type="inttype"/> <xs:element name="price" type="dectype"/> </xs:sequence> </xs:complexType> <xs:complexType name="shipordertype"> <xs:sequence> <xs:element name="orderperson" type="stringtype"/> <xs:element name="shipto" type="shiptotype"/> <xs:element name="item" maxOccurs="unbounded" type="itemtype"/> </xs:sequence> <xs:attribute name="orderid" type="orderidtype" use="required"/> </xs:complexType> <xs:element name="shiporder" type="shipordertype"/> </xs:schema>
restriction ögesi, veri türünün W3C XML Şema Ad alan adı veri türünden geldiğini gösterir. Bu yüzden, aşağıdaki parçacık da, element veya özellik değerlerinin string türünde değer olmasını gerektirir:
<xs:restriction base="xs:string">
Sınırlama elemanı, genellikle elementlere sınırlamalar uygulamak için kullanılır. Aşağıdaki schema'dan alınan bu parçaları inceleyin:
<xs:simpleType name="orderidtype"> <xs:restriction base="xs:string"> <xs:pattern value="[0-9]{6}"/> </xs:restriction> </xs:simpleType>
Bu kod, element veya özellik değerinin dizgi olmasını ve sırasıyla altı karakter olmasını, ve bu karakterlerin 0-9 sayısal değerlerde olmasını gerektirir.
- Önceki Sayfa XSD Eleman Değişimi
- Sonraki Sayfa XSD Dizgi