XML Schema Definition,XSD

XML Schema是基於XML的DTD替代者

XML Schema 可描述XML文檔的結構

 

XML Schema使用XML語法,好處:

  • 可使用 XML 編輯器來編輯 Schema 文件
  • 可使用 XML 解析器來解析 Schema 文件
  • 可通過 XML DOM 來處理 Schema
  • 可通過 XSLT 來轉換 Schema(把數據轉換成另外一種格式來表達)

XML Schema

 

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace ="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">

<xs:element name="note">
<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string"/>
<xs:element name="from" type="xs:string"/>
<xs:element name="heading" type="xs:string"/>
<xs:element name="body" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>

</xs:schema>

代碼解釋:

xmlns:xs="http://www.w3.org/2001/XMLSchema"

 顯示 schema 中用到的元素和數據類型來自命名空間 "http://www.w3.org/2001/XMLSchema" 。同時它還規定了來自命名空間 "http://www.w3.org/2001/XMLSchema" 的元素和數據類型應該使用前綴 xs

targetNamespace="http://www.w3school.com.cn"

 顯示被此 schema 定義的元素 (note, to, from, heading, body) 來自命名空間: "http://www.w3school.com.cn"。

 

xmlns="http://www.w3school.com.cn"

 指出默認的命名空間是 "http://www.w3school.com.cn"。

elementFormDefault="qualified"

 指出任何 XML 實例文檔所使用的且在此 schema 中聲明過的元素必須被命名空間限定。

 

一個XML文件對 XML Schema 的引用

<?xml version="1.0"?>
<note
xmlns="http://www.w3school.com.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi: schemaLocation=" http://www.w3school.com.cn note.xsd ">

<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
 

代碼解釋:

xmlns="http://www.w3school.com.cn"

 規定了默認命名空間的聲明。此聲明會告知 schema 驗證器 ,在此 XML 文檔中使用的所有元素都被聲明於 "http://www.w3school.com.cn" 這個命名空間。

一旦您擁有了可用的 XML Schema 實例命名空間:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

 您就可以使用 schemaLocation 屬性了 。此屬性有兩個值。第一個值是需要使用的命名空間。第二個值是供命名空間使用的 XML schema 的位置:

xsi:schemaLocation ="http://www.w3school.com.cn note.xsd"
 

XSD 簡易元素

    這是一些XML元素:

<lastname>Smith</lastname>
<age>28</age>
<dateborn>1980-03-27</dateborn>

   這是相應的建議元素定義:

<xs:element name="lastname" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
<xs:element name="dateborn" type="xs:date"/>

 

  XSD 屬性

     這是帶有屬性的 XML 元素:

<lastname lang="EN">Smith</lastname>

     這是對應的屬性定義:

<xs:attribute name="lang" type="xs:string"/>

屬性的默認值和固定值和屬性必選

<xs:attribute name="lang" type="xs:string" default="EN"/>
<xs:attribute name="lang" type="xs:string" fixed="EN"/>
<xs:attribute name="lang" type="xs:string" use="required"/>

對一組值的限定

如需把 XML 元素的內容限制爲一組可接受的值,我們要使用枚舉約束(enumeration constraint)

下面的例子定義 了帶有一個限定的名爲 "car" 的元素可接受的值只有 :Audi, Golf, BMW:

<xs:element name="car">

<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Audi"/>
<xs:enumeration value="Golf"/>
<xs:enumeration value="BMW"/>
</xs:restriction>
</xs:simpleType>

</xs:element>

 上面的例子也可以被寫爲:

<xs:element name="car" type="carType"/ >

<xs:simpleType name="carType">
<xs:restriction base="xs:string">
<xs:enumeration value="Audi"/>
<xs:enumeration value="Golf"/>
<xs:enumeration value="BMW"/>
</xs:restriction>
</xs:simpleType>

註釋 在這種情況下,類型 "carType" 可被其他元素使用,因爲它不是 "car" 元素的組成部分。

 

一個 XSD 實例

XML 文檔

讓我們看看這個名爲 "shiporder.xml" 的 XML 文檔:

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

創建一個 XML Schema

這是這個名爲 "shiporder.xsd" 的 schema 文件的文檔清單:

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

分割 Schema

接下來介紹的設計方法基於首先對所有元素和屬性的定義,然後再使用 ref 屬性來引用它們。

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

使用指定的類型(Named Types)

 第三種設計方法定義了類或者類型,這樣使我們有能力重複使用元素的定義。具體的方式是:首先對簡易元素和複合元素進行命名,然後通過元素的 type 屬性來指向它們。

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

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章