- XSD 教程
- XSD - 首頁
- XSD - 概述
- XSD - 語法
- XSD - 驗證
- XSD - 簡單型別
- XSD - 複雜型別
- XSD - 字串
- XSD - 日期時間
- XSD - 數值
- XSD - 其他
- XSD 有用資源
- XSD 快速指南
- XSD - 有用資源
- XSD - 討論
XSD 快速指南
XSD - 概述
XML 模式定義,通常稱為 XSD,是一種精確描述 XML 語言的方式。XSD 根據相應 XML 語言的語法規則檢查 XML 文件的結構和詞彙的有效性。
XML 文件可以定義為 -
格式良好 - 如果 XML 文件符合所有通用 XML 規則,例如標籤必須正確巢狀,開始和結束標籤必須平衡,並且空標籤必須以 '/>' 結尾,則稱為格式良好。
或
有效 - 當 XML 文件不僅格式良好,而且還符合可用的 XSD 時,該 XML 文件被稱為有效,該 XSD 指定它使用的標籤、這些標籤可以包含哪些屬性以及哪些標籤可以出現在其他標籤內,以及其他屬性。
下圖顯示瞭如何使用 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>
特徵
以下是 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.xml 與students.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.xsd 和students.xml 作為引數傳遞。
E:\java\java XSDValidator students.xsd students.xml
驗證輸出
您將看到以下結果 -
students.xml is valid against students.xsd
XSD - 簡單型別
在本章中,我們將瞭解 XSD 定義的簡單型別。
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> 元素用於模式未定義的元素 |
| 7 |
<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 位整數 |
限制
以下型別的限制可用於其他資料型別,但布林資料型別除外 -
- 列舉
- 長度
- 最大長度
- 最小長度
- 模式
- 空白