En son web geliştirme öğreticiler
 

Bir XSD Örnek


Bu bölüm bir XML Şeması yazma gösterecektir. Ayrıca şema farklı şekillerde yazılabilir olduğunu öğrenecektir.


Bir XML Belge

En adlandırılan bu XML belgesine bir göz atalım "shiporder.xml" :

<?xml version="1.0" encoding="UTF-8"?>

<shiporder orderid="889923"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="shiporder.xsd">
  <orderperson>John Smith</orderperson>
  <shipto>
    <name>Ola Nordmann</name>
    <address>Langgt 23</address>
    <city>4000 Stavanger</city>
    <country>Norway</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>

XML belgesi üzerinde bir kök elemanı oluşur "shiporder" adlı bir gerekli özelliği içeriyor, "orderid" . "shiporder" : eleman üç farklı alt öğe içermeyen "orderperson" , "shipto" ve "item" . "item" eleman iki kez görünür ve bir içeriyor "title" , isteğe bağlı "note" eleman, bir "quantity" ve "price" öğesi.

çizgi üstünde: xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" bu belge bir şemayla karşılaştırarak kontrol edilmelidir XML ayrıştırıcı söyler. Satır: xsi: şema bulunduğu NEREDE noNamespaceSchemaLocation = "shiporder.xsd" belirtir (here it is in the same folder as "shiporder.xml") .


Bir XML Şeması Oluşturma

Şimdi yukarıdaki XML belgesi için bir şema oluşturmak istiyorum.

Biz arayacak yeni bir dosya açarak başlamak "shiporder.xsd" . şema oluşturmak için biz sadece XML belgesindeki yapıyı takip etmek ve onu buldukça her bir öğeyi tanımlayabiliriz. bir şema tanımlar şema elemanı: Biz xs tarafından takip standart XML bildirimi ile başlayacak:

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
...
</xs:schema>

Biz standart ad kullanmak Yukarıdaki şemada (xs) bu ad ile ilişkilidir ve URI http://www.w3.org/2001/XMLSchema standart değere sahiptir şema dil tanımı vardır.

Sonra, tanımlamak zorunda "shiporder" elemanı. Bu eleman bir öznitelik vardır ve bu nedenle karmaşık bir türü olarak görürken, diğer öğeler içeriyor. Alt öğeleridir "shiporder" alt unsurların düzenli diziyi tanımlayan dizi elemanı: eleman bir xs ile çevrilidir:

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      ...
    </xs:sequence>
  </xs:complexType>
</xs:element>

Sonra tanımlamak zorunda "orderperson" (herhangi özelliklerini veya diğer öğeleri içermediğinden) basit türü olarak eleman. Tipi (xs:string) Önceden tanımlanmış bir şema veri türünü gösterir XML Şema ile ilişkili ad alanı öneki: öneki bulunur

<xs:element name="orderperson" type="xs:string"/>

: Sonra, kompleks tipte olan iki elemanlarını tanımlamak zorunda "shipto" ve "item" . Biz tanımlayarak başlamak "shipto" eleman:

<xs:element name="shipto">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="address" type="xs:string"/>
      <xs:element name="city" type="xs:string"/>
      <xs:element name="country" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

şemalar ile biz minOccurs niteliklerini maxOccurs ve belirtilen elemanı olası olay sayısını tanımlayabilirsiniz. maxOccurs bir element için olaylar maksimum sayısını belirtir ve minOccurs bir element için geçtiği asgari sayısını belirler. maxOccurs ve minOccurs ikisi için varsayılan değer 1'dir!

Şimdi tanımlayabilirsiniz "item" elemanı. Bu eleman bir iç birden çok kez görünebilir "shiporder" unsuru. Bu ayarlayarak tanımlanabilir maxOccurs vasfını "item" öğesine "unbounded" olabildiğince çok oluşumları olması anlamına gelir "item" yazar isteklerine olarak eleman. Dikkat edin "note" öğe isteğe bağlıdır. Biz ayarlayarak bu belirttiğiniz minOccurs sıfıra bağlıyor:

<xs:element name="item" maxOccurs="unbounded">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="title" type="xs:string"/>
      <xs:element name="note" type="xs:string" minOccurs="0"/>
      <xs:element name="quantity" type="xs:positiveInteger"/>
      <xs:element name="price" type="xs:decimal"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Biz şimdi niteliğini ilan edebilir "shiporder" unsuru. bu bizim kullanımını belirtmek gerekli bir özellik olduğundan = "required".

Note: öznitelik bildirimleri her zaman en son gelmelidir:

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

İşte denilen şema dosyasının tam listesidir "shiporder.xsd" :

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="orderperson" type="xs:string"/>
      <xs:element name="shipto">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="name" type="xs:string"/>
            <xs:element name="address" type="xs:string"/>
            <xs:element name="city" type="xs:string"/>
            <xs:element name="country" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="item" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="title" type="xs:string"/>
            <xs:element name="note" type="xs:string" minOccurs="0"/>
            <xs:element name="quantity" type="xs:positiveInteger"/>
            <xs:element name="price" type="xs:decimal"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="orderid" type="xs:string" use="required"/>
  </xs:complexType>
</xs:element>

</xs:schema>

Şemayı bölün

Bir önceki tasarım yöntemi çok basittir, ancak okumak ve belgeler karmaşık olduğunda korumak için zor olabilir.

Bir sonraki tasarım yöntemi tüm öğelerini tanımlamaya dayanmaktadır ve ilk niteliklerini ve ardından kullanarak bunlar bahsediyor ref niteliğini.

İşte şema dosyasının yeni tasarım ("shiporder.xsd") :

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<!-- definition of simple elements -->
<xs:element name="orderperson" type="xs:string"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
<xs:element name="title" type="xs:string"/>
<xs:element name="note" type="xs:string"/>
<xs:element name="quantity" type="xs:positiveInteger"/>
<xs:element name="price" type="xs:decimal"/>

<!-- definition of attributes -->
<xs:attribute name="orderid" type="xs:string"/>

<!-- definition of complex elements -->
<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>

Adlandırılan Türleri Kullanma

Üçüncü tasarım yöntemi eleman tanımlarını yeniden bize sağlayan, sınıfları ve türlerini tanımlar. Bu simpleTypes ve complexTypes elemanları adlandırma ile yapılır ve daha sonra üzerinden bu nokta type elemanın öznitelik.

İşte şema dosyasının üçüncü tasarım ("shiporder.xsd") :

<?xml version="1.0" encoding="UTF-8" ?>
<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>

sınırlama elemanı veri türü W3C XML Şema ad veri türü türetilmiş olduğunu gösterir. Yani, şu parçası öğe veya öznitelik değeri bir dize değeri olması gerektiği anlamına gelir:

<xs:restriction base="xs:string">

sınırlama elemanı daha sık elemanlarına kısıtlamaları uygulamak için kullanılır. Yukarıdaki şemadan aşağıdaki satırları bakın:

<xs:simpleType name="orderidtype">
  <xs:restriction base="xs:string">
    <xs:pattern value="[0-9]{6}"/>
  </xs:restriction>
</xs:simpleType>

Bu öğe veya öznitelik değeri bir dize olmalıdır belirtir, bu üst üste tam altı karakter uzunluğunda olmalıdır ve bu karakterler 0'dan 9'a kadar bir sayı olmalıdır.