Mtu wa Kifupi cha XSD

本节会为您演示如何编写一个 XML Schema。您还将学习到编写 schema 的不同方法。

XML 文档

让我们看看这个名为 "shiporder.xml" 的 XML 文档:



 George Bush
 
  John Adams
  
Oxford Street
London UK
Empire Burlesque Special Edition 1 10.90 Hide your heart 1 9.90

上面的XML文档包括根元素 "shiporder",其中包含必须名为 "orderid" 的属性。"shiporder" 元素包含三个不同的子元素:"orderperson"、"shipto" 以及 "item"。"item" 元素出现了两次,它含有一个 "title"、一个可选 "note" 元素、一个 "quantity" 以及一个 "price" 元素。

上面这一行 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance",告知XML解析器根据某个 schema 来验证此文档。这一行:xsi:noNamespaceSchemaLocation="shiporder.xsd" 规定了 schema 的位置(在这里,它与 "shiporder.xml" 处于相同的文件夹)。

Kumefanya XML Schema

Sasa, tunahitaji kumefanya schema ya hatua ya hii ya XML.

Tunaweza kuanza kwa kufungua mafichi mpya, na kumwambia kama "shiporder.xsd". Kufanya schema, tunakufanya kama mawendo ya hatua ya kuzingatia XML, kumefanua kila elementi tunakupatikana. Kwanza tunananza kumefanua uafisha wa XML wa kawaida:

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

Kwenye schema ya juu, tumetumia eneo lingine (xs), eneo lingine hii inapendekeza kwa URI ya Schema ya lugha ya kuzingatia (Schema language definition), ina uwezo wa http://www.w3.org/2001/XMLSchema.

Kisha tunahitaji kumefanya elementi ya "shiporder" kama aina ya kipendekezo. Elementi hii ina uwezo wa maelezo, kwa hiyo tunaelezea inaonesha uwezo wa kipendekezo. Mfumo wa watoto wa elementi ya "shiporder" unaonesha na elementi ya xs:sequence, inafafanua mawendo ya watoto:

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

Kisha tunahitaji kumefanya elementi ya "orderperson" kama aina ya kizamani (hii inaweza kumekadiri kwa sababu haina uwezo au elementi zingine). Mfumo wa kwanza wa (xs:string) unapendekeza kwa kufikiria mifano wa eneo lingine unaofikiria schema ya XML ya kuzingatia data ya kizamani ya schema:

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

Kisha, naona kuwa naanza kumefanya elementi kama aina ya kipendekezo: "shipto" na "item". Tunapokuja kuanza kumefanya elementi ya "shipto":

<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>

Kwa schema, tunaweza kutumia maxOccurs na minOccurs kufafanua mara anayopendekeza ya elementi inayopatikana. maxOccurs inafafanua mara kubwa ya elementi, na minOccurs inafafanua mara kicukua ya elementi. Makusanyiko wa maxOccurs na minOccurs wanaingia kwa 1!

Sasa, tunaweza kumefanya ufafanuzi ya elementi ya "item". Element hii inaweza kuhitaji kwa elementi ya "shiporder" mara nyingi. Hii inafanana na kufikiria uwezo wa elementi ya "item" kwa ukurusa uwezo wa "unbounded", kwa hiyo elementi ya "item" inaweza kuonekana mara nyingi kama anaonesha mwenye uanzu. Tafadhali, elementi ya "note" inaonesha elementi yenye uwezo. Simekuwa kumefanya elementi hii inaeleza uwezo wa minOccurs wa 0:

<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>

Sasa, tunaweza kufikiria vipendo vya kifaa ya data ya "shiporder". Kwa sababu hii ni vipendo vya kipakuo, tunakosema kwa kina kwa sababu use="required".

Mafanikio:Utafiti huu wa kina lazima uweze kuwa kwa mwisho:

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

Hii ni orodha ya wasiaja wa waschema hii ya kifaa ya data ya kwanza kuwa "shiporder.xsd":

<?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 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>

Kuchukua Schema

Mtwara hii haujui kufikiria, lakini inapunguza kumaghadhi na kumachagua kama hii ina uharibifu kwa kumtaarifu hali inayofikiria.

Mtwara hii inaangalia mtindo wa kuzenga wa kwanza kufikiria kufafanua vifaa na vipengine vya kufikiria, baadaye kutumia kipendekezo cha ref kwa kurejea kwa vifaa na vipengine hivi.

Hii niwezwa kwa mtindo mpya huo wa kuzenga waschema mifaa ya data:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- 简易元素的定义 -->
<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"/>
<!-- 属性的定义 -->
<xs:attribute name="orderid" type="xs:string"/>
<!-- 复合元素的定义 -->
<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>

Tumia kina kina zilizotumika

Methodi ya ujenzi wa tatu ya kudokeza kina jina kwa kila kiwango au kina kina, kwa hivyo tunapata uwezo wa kutumia ufafanuzi wa ulemavu. Njia inayotumiwa ni: kwanza kumwambaa jina kwa kina kina au kina kina zaidi, kisha kutumia kina kina ya type kwa kuharibika kwa kina kina.

Hii ni schema ya ujenzi wa methodi ya tatu ("shiporder.xsd")::

<?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>

mfulizi hauzishiriki data type ina mchana kutoka kwa eneo la W3C XML Schema. Kwa hivyo, kwenye kipengele hiki kinamaanisha kwamba thamani ya kina au ya kina lazima ina namba:

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

mfulizi wa mwenye uwezo wa kumweka mizingo kwa kina. Tazama kwenye hapa ya schema yana uwezo:

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

Hii inaonyesha kwamba thamani ya kifupi au kifupi ya element au maelezo lazima iwe uainishaji wa kifupi, na lazima iwe nane kwa nafasi, na lazima iwe namba 0-9.