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.com"
xmlns = "https://tutorialspoint.com"
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.com"
xmlns = "https://tutorialspoint.com" 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.com"
以上片段指定了此模式中使用的元素在 https://tutorialspoint.com 命名空间中定义。它是可选的。
xmlns = "https://tutorialspoint.com"
以上片段指定默认命名空间为 https://tutorialspoint.com。
elementFormDefault = "qualified"
以上片段表示在此模式中声明的任何元素在任何 XML 文档中使用之前都必须限定命名空间。它是可选的。
引用模式
请查看以下引用模式 -
<?xml version = "1.0"?>
<class xmlns = "https://tutorialspoint.com"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "https://tutorialspoint.com 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.com"
以上片段指定默认命名空间声明。此命名空间由模式验证器用于检查所有元素是否属于此命名空间的一部分。它是可选的。
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "https://tutorialspoint.com 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.com/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 位整数 |
限制
以下类型的限制可用于其他数据类型,但布尔数据类型除外 -
- 枚举
- 长度
- 最大长度
- 最小长度
- 模式
- 空白