XSD 快速指南



XSD - 概述

XML 模式定義,通常稱為 XSD,是一種精確描述 XML 語言的方式。XSD 根據相應 XML 語言的語法規則檢查 XML 文件的結構和詞彙的有效性。

XML 文件可以定義為 -

  • 格式良好 - 如果 XML 文件符合所有通用 XML 規則,例如標籤必須正確巢狀,開始和結束標籤必須平衡,並且空標籤必須以 '/>' 結尾,則稱為格式良好

  • 有效 - 當 XML 文件不僅格式良好,而且還符合可用的 XSD 時,該 XML 文件被稱為有效,該 XSD 指定它使用的標籤、這些標籤可以包含哪些屬性以及哪些標籤可以出現在其他標籤內,以及其他屬性。

下圖顯示瞭如何使用 XSD 來構建 XML 文件 -

XSD Technology

這是一個簡單的 XSD 程式碼。請看一看。

<?xml version = "1.0"?>

<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema">
   targetNamespace = "https://tutorialspoint.tw" 
   xmlns = "https://tutorialspoint.tw"
   elementFormDefault = "qualified">

   <xs:element name = 'class'>
      <xs:complexType>
         <xs:sequence>
            <xs:element name = 'student' type = 'StudentType' minOccurs = '0' 
               maxOccurs = 'unbounded' />
         </xs:sequence>
      </xs:complexType>
   </xs:element>

   <xs:complexType name = "StudentType">
      <xs:sequence>
         <xs:element name = "firstname" type = "xs:string"/>
         <xs:element name = "lastname" type = "xs:string"/>
         <xs:element name = "nickname" type = "xs:string"/>
         <xs:element name = "marks" type = "xs:positiveInteger"/>
      </xs:sequence>
      <xs:attribute name = 'rollno' type = 'xs:positiveInteger'/>
   </xs:complexType>
   
</xs:schema>

特徵

以下是 XSD 一些流行特徵的列表 -

  • XSD 可以擴充套件以供將來新增。
  • XSD 比 DTD 更豐富、更強大。
  • XSD 是用 XML 編寫的。
  • XSD 支援資料型別。
  • XSD 支援名稱空間。
  • XSD 是 W3C 建議。

XSD 語法

XML XSD 儲存在單獨的文件中,然後可以將該文件連結到 XML 文件以使用它。

語法

XSD 的基本語法如下 -

<?xml version = "1.0"?>

<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema">
   targetNamespace = "https://tutorialspoint.tw"
   xmlns = "https://tutorialspoint.tw" elementFormDefault = "qualified">
   
   <xs:element name = 'class'>
      <xs:complexType>
         <xs:sequence>
            <xs:element name = 'student' type = 'StudentType' minOccurs = '0' 
               maxOccurs = 'unbounded' />
         </xs:sequence>
      </xs:complexType>
   </xs:element>

   <xs:complexType name = "StudentType">
      <xs:sequence>
         <xs:element name = "firstname" type = "xs:string"/>
         <xs:element name = "lastname" type = "xs:string"/>
         <xs:element name = "nickname" type = "xs:string"/>
         <xs:element name = "marks" type = "xs:positiveInteger"/>
      </xs:sequence>
      <xs:attribute name = 'rollno' type = 'xs:positiveInteger'/>
   </xs:complexType>
   
</xs:schema>

<Schema> 元素

Schema 是 XSD 的根元素,始終需要。

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

以上片段指定了模式中使用的元素和資料型別在 http://www.w3.org/2001/XMLSchema 名稱空間中定義,並且這些元素/資料型別應以 xs 為字首。它始終是必需的。

targetNamespace = "https://tutorialspoint.tw"

以上片段指定了此模式中使用的元素在 https://tutorialspoint.tw 名稱空間中定義。它是可選的。

xmlns = "https://tutorialspoint.tw"

以上片段指定預設名稱空間為 https://tutorialspoint.tw

elementFormDefault = "qualified"

以上片段表示在此模式中宣告的任何元素在任何 XML 文件中使用之前都必須限定名稱空間。它是可選的。

引用模式

請檢視以下引用模式 -

<?xml version = "1.0"?>

<class xmlns = "https://tutorialspoint.tw"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "https://tutorialspoint.tw student.xsd">  
   
   <student rollno = "393">    
      <firstname>Dinkar</firstname>
      <lastname>Kad</lastname>
      <nickname>Dinkar</nickname>
      <marks>85</marks>
   </student>
   
   <student rollno = "493">	 
      <firstname>Vaneet</firstname>
      <lastname>Gupta</lastname>
      <nickname>Vinni</nickname>
      <marks>95</marks>
   </student>
   
   <student rollno = "593">    
      <firstname>Jasvir</firstname>
      <lastname>Singh</lastname>
      <nickname>Jazz</nickname>
      <marks>90</marks>
   </student>
</class>
xmlns = "https://tutorialspoint.tw"

以上片段指定預設名稱空間宣告。此名稱空間由模式驗證器用於檢查所有元素是否屬於此名稱空間的一部分。它是可選的。

xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "https://tutorialspoint.tw student.xsd">  

定義 XMLSchema-instance xsi 後,使用 schemaLocation 屬性。此屬性有兩個值,名稱空間和要使用的 XML 模式的位置,用空格分隔。它是可選的。

XSD - 驗證

我們將使用基於 Java 的 XSD 驗證器來驗證students.xmlstudents.xsd

students.xml

<?xml version = "1.0"?>

<class>  
   <student rollno = "393">
      <firstname>Dinkar</firstname>    
      <lastname>Kad</lastname>
      <nickname>Dinkar</nickname>
      <marks>85</marks>	 
   </student>
   
   <student rollno = "493">	 
      <firstname>Vaneet</firstname>
      <lastname>Gupta</lastname>
      <nickname>Vinni</nickname>
      <marks>95</marks>
   </student>
   
   <student rollno = "593">    
      <firstname>Jasvir</firstname>
      <lastname>Singh</lastname>
      <nickname>Jazz</nickname>
      <marks>90</marks>
   </student>
</class>

students.xsd

<?xml version = "1.0"?>

<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema">
   <xs:element name = 'class'>
      <xs:complexType>
         <xs:sequence>
             <xs:element name = 'student' type = 'StudentType' minOccurs = '0' 
                maxOccurs = 'unbounded' />
         </xs:sequence>
      </xs:complexType>
   </xs:element>

   <xs:complexType name = "StudentType">
      <xs:sequence>
         <xs:element name = "firstname" type = "xs:string"/>
         <xs:element name = "lastname" type = "xs:string"/>
         <xs:element name = "nickname" type = "xs:string"/>
         <xs:element name = "marks" type = "xs:positiveInteger"/>
      </xs:sequence>
      <xs:attribute name = 'rollno' type = 'xs:positiveInteger'/>
   </xs:complexType>			 
</xs:schema>

XSDValidator.java

import java.io.File;
import java.io.IOException;

import javax.xml.XMLConstants;
import javax.xml.transform.stream.StreamSource;

import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;

import org.xml.sax.SAXException;

public class XSDValidator {
   public static void main(String[] args) {
      if(args.length !=2){
         System.out.println("Usage : XSDValidator <file-name.xsd> <file-name.xml>" );
      } else {
         boolean isValid = validateXMLSchema(args[0],args[1]);
         
         if(isValid){
            System.out.println(args[1] + " is valid against " + args[0]);
         } else {
            System.out.println(args[1] + " is not valid against " + args[0]);
         }
      }
   }
   
   public static boolean validateXMLSchema(String xsdPath, String xmlPath){
      try {
         SchemaFactory factory =
            SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            Schema schema = factory.newSchema(new File(xsdPath));
            Validator validator = schema.newValidator();
            validator.validate(new StreamSource(new File(xmlPath)));
      } catch (IOException e){
         System.out.println("Exception: "+e.getMessage());
         return false;
      } catch(SAXException e1){
         System.out.println("SAX Exception: "+e1.getMessage());
         return false;
      }
		
      return true;
   }
}

驗證 XML 與 XSD 的步驟

  • XSDValidator.java 檔案複製到任何位置,例如E: > java

  • students.xml 複製到相同位置E: > java

  • students.xsd 複製到相同位置E: > java

  • 使用控制檯編譯XSDValidator.java。確保您的機器上安裝了 JDK 1.5 或更高版本,並且已配置類路徑。有關如何使用 JAVA 的詳細資訊,請參閱 JAVA 教程

E:\java\javac XSDValidator.java
  • 執行XSDValidator 並將students.xsdstudents.xml 作為引數傳遞。

E:\java\java XSDValidator students.xsd students.xml

驗證輸出

您將看到以下結果 -

students.xml is valid against students.xsd

XSD - 簡單型別

在本章中,我們將瞭解 XSD 定義的簡單型別。

序號 簡單型別和描述
1

元素

簡單元素只能包含文字。它不能包含任何其他元素。

2

屬性

屬性本身就是一種型別,用於複雜元素中。

3

限制

限制定義了 XML 元素的可接受值。

XSD - 複雜型別

複雜元素是可以包含其他元素和/或屬性的 XML 元素。我們可以透過兩種方式建立複雜元素 -

  • 定義複雜型別,然後使用type 屬性建立元素

  • 透過命名直接定義複雜型別

定義複雜型別,然後使用型別屬性建立元素。

<xs:complexType name = "StudentType">
   <xs:sequence>
      <xs:element name = "firstname" type = "xs:string"/>
      <xs:element name = "lastname" type = "xs:string"/>
      <xs:element name = "nickname" type = "xs:string"/>
      <xs:element name = "marks" type = "xs:positiveInteger"/>
   </xs:sequence>
   <xs:attribute name = 'rollno' type = 'xs:positiveInteger'/>
</xs:complexType>

<xs:element name = 'student' type = 'StudentType' />			 

透過命名直接定義複雜型別。

<xs:element name = "student">
   <xs:complexType>   
      <xs:sequence>
         <xs:element name = "firstname" type = "xs:string"/>
         <xs:element name = "lastname" type = "xs:string"/>
         <xs:element name = "nickname" type = "xs:string"/>
         <xs:element name = "marks" type = "xs:positiveInteger"/>
      </xs:sequence>
   <xs:attribute name = 'rollno' type = 'xs:positiveInteger'/>
   </xs:complexType>
<xs:element>

以下是 XSD 支援的複雜型別的列表。

序號 簡單型別和描述
1

複雜空複雜型別元素只能具有屬性,但沒有內容。

2

僅元素

僅元素複雜型別元素只能包含元素

3

僅文字

僅文字複雜型別元素只能包含屬性和文字。

4

混合

混合複雜型別元素可以包含元素、屬性和文字。

5

指示器

指示器控制在 XML 文件中組織元素的方式。

6

<any>

<any> 元素用於模式未定義的元素

7

<anyAttribute>

<anyAttribute> 屬性用於模式未定義的屬性。

XSD - 字串

字串資料型別用於表示 XML 文件中的字元。

<xs:string> 資料型別

<xs:string> 資料型別可以採用字元、換行符、回車符和製表符。XML 處理器不會將內容中的換行符、回車符和製表符替換為空格,並保持其完整性。例如,在顯示過程中會保留多個空格或製表符。

<xs:string> 示例

xsd 中的元素宣告 -

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

xml 中的元素用法 -

<name>Dinkar</name>
<name>Dinkar    Kad</name>

<xs:token> 資料型別

<xs:token> 資料型別派生自 <string> 資料型別,可以採用字元、換行符、回車符和製表符。XML 處理器將刪除換行符、製表符、回車符、前導和尾隨空格以及多個空格。

<xs:token> 示例

xsd 中的元素宣告 -

<xs:element name = "name" type = "xs:token"/>

xml 中的元素用法 -

<name>Dinkar</name>
<name>Dinkar    Kad</name>

字串資料型別

以下是常用的派生自 <string> 資料型別的資料型別的列表。

序號 名稱和描述
1

ID

表示 XML 中的 ID 屬性,用於模式屬性中。

2

IDREF

表示 XML 中的 IDREF 屬性,用於模式屬性中。

3

語言

表示有效的語言 ID

4

名稱

表示有效的 XML 名稱

5

NMTOKEN

表示 XML 中的 NMTOKEN 屬性,用於模式屬性中。

6

normalizedString

表示不包含換行符、回車符或製表符的字串。

7

字串

表示可以包含換行符、回車符或製表符的字串。

8

標記

表示不包含換行符、回車符、製表符、前導或尾隨空格或多個空格的字串

限制

以下型別的限制可用於字串資料型別 -

  • 列舉
  • 長度
  • 最大長度
  • 最小長度
  • 模式
  • 空白

XSD - 日期時間

日期和時間資料型別用於表示 XML 文件中的日期和時間。

<xs:date> 資料型別

<xs:date> 資料型別用於以 YYYY-MM-DD 格式表示日期。

  • YYYY - 表示年份

  • MM - 表示月份

  • DD - 表示日期

<xs:date> 示例

XSD 中的元素宣告 -

<xs:element name = "birthdate" type = "xs:date"/>

XML 中的元素用法 -

<birthdate>1980-03-23</birthdate>

<xs:time> 資料型別

<xs:time> 資料型別用於以 hh:mm:ss 格式表示時間。

  • hh - 表示小時

  • mm - 表示分鐘

  • ss - 表示秒

<xs:time> 示例

XSD 中的元素宣告 -

<xs:element name = "startTime" type = "xs:time"/>

XML 中的元素用法 -

<startTime>10:20:15</startTime>

<xs:datetime> 資料型別

<xs:datetime> 資料型別用於以 YYYY-MM-DDThh:mm:ss 格式表示日期和時間。

  • YYYY - 表示年份

  • MM - 表示月份

  • DD - 表示日期

  • T - 表示時間部分的開始

  • hh - 表示小時

  • mm - 表示分鐘

  • ss - 表示秒

<xs:datetime> 示例

XSD 中的元素宣告 -

<xs:element name = "startTime" type = "xs:datetime"/>

XML 中的元素用法 -

<startTime>1980-03-23T10:20:15</startTime>

<xs:duration> 資料型別

<xs:duration> 資料型別用於以 PnYnMnDTnHnMnS 格式表示時間間隔。除 P 外,每個元件都是可選的。

  • P - 表示日期部分的開始

  • nY - 表示年

  • nM - 表示月

  • nD - 表示日

  • T - 表示時間部分的開始

  • nH - 表示小時

  • nM - 表示分鐘

  • nS - 表示秒

<xs:duration> 示例

XSD 中的元素宣告 -

<xs:element name = "period" type = "xs:duration"/>

xml 中的元素用法表示 6 年、3 個月、10 天和 15 小時的週期。

<period>P6Y3M10DT15H</period>

日期資料型別

以下是常用的日期資料型別的列表。

序號 名稱和描述
1.

日期

表示日期值

2.

dateTime

表示日期和時間值

3.

持續時間

表示時間間隔

4.

gDay

表示日期的一部分,即日期 (DD)

5.

gMonth

表示日期的一部分,即月份 (MM)

6.

gMonthDay

表示日期的一部分,即月份和日期 (MM-DD)

7.

gYear

表示日期的一部分,即年份 (YYYY)

8.

gYearMonth

表示日期的一部分,即年份和月份 (YYYY-MM)

9.

時間

表示時間值

限制

以下型別的限制可用於日期資料型別 -

  • 列舉
  • maxExclusive
  • maxInclusive
  • minExclusive
  • minInclusive
  • 模式
  • 空白

XSD - 數值資料型別

數值資料型別用於表示 XML 文件中的數字。

<xs:decimal> 資料型別

<xs:decimal> 資料型別用於表示數值。它支援最多 18 位的十進位制數。

<xs:decimal> 示例

XSD 中的元素宣告 -

<xs:element name = "score" type = "xs:decimal"/>

XML 中的元素用法 -

<score>9.12</score>

<xs:integer> 資料型別

<xs:integer> 資料型別用於表示整數值。

<xs:integer> 示例

XSD 中的元素宣告 -

<xs:element name = "score" type = "xs:integer"/>

XML 中的元素用法 -

<score>9</score>

數值資料型別

以下是常用的數值資料型別的列表。

序號 名稱和描述
1.

位元組

帶符號的 8 位整數

2.

十進位制

十進位制值

3.

int

帶符號的 32 位整數

4.

整數

整數值

5.

帶符號的 64 位整數

6.

negativeInteger

僅具有負值的整數 (..,-2,-1)

7.

nonNegativeInteger

僅具有非負值的整數 (0,1,2,..)

8.

nonPositiveInteger

僅具有非正值的整數 (..,-2,-1,0)

9.

positiveInteger

僅具有正值的整數 (1,2,..)

10.

帶符號的 16 位整數

11.

unsignedLong

無符號的 64 位整數

12.

unsignedInt

無符號的 32 位整數

13.

unsignedShort

無符號的 16 位整數

14.

unsignedByte

無符號的 8 位整數

限制

以下型別的限制可用於日期資料型別 -

  • 列舉
  • fractionDigits
  • maxExclusive
  • maxInclusive
  • minExclusive
  • minInclusive
  • 模式
  • totalDigits
  • 空白

XSD - 其他資料型別

XSD 還有一些其他重要的資料型別,例如布林型、二進位制型anyURI。

<xs:boolean> 資料型別

<xs:boolean> 資料型別用於表示 true、false、1(表示 true)或 0(表示 false)值。

<xs:boolean> 示例

XSD 中的元素宣告 -

<xs:element name = "pass" type = "xs:boolean"/>

XML 中的元素用法 -

<pass>false</pass>

二進位制資料型別

二進位制資料型別用於表示二進位制值。兩種二進位制型別常用。

  • base64Binary - 表示 base64 編碼的二進位制資料

  • hexBinary - 表示十六進位制編碼的二進位制資料

<xs:hexbinary> 示例

XSD 中的元素宣告 -

<xs:element name = "blob" type = "xs:hexBinary"/>

XML 中的元素用法 -

<blob>9FEEF</blob>

<xs:anyURI> 資料型別

<xs:anyURI> 資料型別用於表示 URI。

<xs:anyURI> 示例

XSD 中的元素宣告 -

<xs:attribute name = "resource" type = "xs:anyURI"/>

XML 中的元素用法 -

<image resource = "https://tutorialspoint.tw/images/smiley.jpg" />

數值資料型別

以下是常用的數值資料型別的列表。

序號 名稱和描述
1.

位元組

帶符號的 8 位整數

2.

十進位制

十進位制值

3.

int

帶符號的 32 位整數

4.

整數

整數值

5.

帶符號的 64 位整數

6.

negativeInteger

僅具有負值的整數 (..,-2,-1)

7.

nonNegativeInteger

僅具有非負值的整數 (0,1,2,..)

8.

nonPositiveInteger

僅具有非正值的整數 (..,-2,-1,0)

9.

positiveInteger

僅具有正值的整數 (1,2,..)

10.

帶符號的 16 位整數

11.

unsignedLong

無符號的 64 位整數

12.

unsignedInt

無符號的 32 位整數

13.

unsignedShort

無符號的 16 位整數

14.

unsignedByte

無符號的 8 位整數

限制

以下型別的限制可用於其他資料型別,但布林資料型別除外 -

  • 列舉
  • 長度
  • 最大長度
  • 最小長度
  • 模式
  • 空白
廣告
© . All rights reserved.