XSD - 快速指南


XSD - 概述

XML 模式定义,通常称为 XSD,是一种精确描述 XML 语言的方法。XSD 根据相应 XML 语言的语法规则检查 XML 文档的结构和词汇的有效性。

XML 文档可以定义为 -

  • 格式良好- 如果 XML 文档遵守所有通用 XML 规则,例如标签必须正确嵌套、开始和结束标签必须平衡、空标签必须以“/>”结尾,则称为格式良好

    或者

  • 有效- 当 XML 文档不仅格式良好,而且还符合可用的 XSD,指定它使用哪些标签、这些标签可以包含哪些属性以及哪些标签可以出现在其他标签内等时,就被认为是有效的特性。

下图显示了如何使用 XSD 来构建 XML 文档 -

鑫盛达科技

这是一个简单的 XSD 代码。看看它。

<?xml version = "1.0"?>

<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema">
   targetNamespace = "http://www.tutorialspoint.com" 
   xmlns = "http://www.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 = "http://www.tutorialspoint.com"
   xmlns = "http://www.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 是 XSD 的根元素,并且始终是必需的。

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

上面的片段指定模式中使用的元素和数据类型在http://www.w3.org/2001/XMLSchema命名空间中定义,并且这些元素/数据类型应以xs为前缀。它始终是必需的。

targetNamespace = "http://www.tutorialspoint.com"

上面的片段指定此架构中使用的元素是在http://www.tutorialspoint.com命名空间中定义的。它是可选的。

xmlns = "http://www.tutorialspoint.com"

上面的片段指定默认命名空间是http://www.tutorialspoint.com

elementFormDefault = "qualified"

上面的片段表明在此模式中声明的任何元素在任何 XML 文档中使用它们之前都必须经过命名空间限定。它是可选的。

引用模式

看看下面的参考架构 -

<?xml version = "1.0"?>

<class xmlns = "http://www.tutorialspoint.com"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://www.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 = "http://www.tutorialspoint.com"

上面的片段指定了默认名称空间声明。模式验证器使用此命名空间来检查所有元素是否属于此命名空间。它是可选的。

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

定义 XMLSchema-instance xsi 后,使用schemaLocation属性。该属性有两个值:命名空间和 XML 模式的位置,使用时用空格分隔。它是可选的。

XSD - 验证

我们将使用基于 Java 的 XSD 验证器来根据Students.xsd验证Students.xml

学生.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>

学生.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;
   }
}

根据 XSD 验证 XML 的步骤

  • 将XSDValidator.java文件复制到任意位置,例如E: > java

  • 将Students.xml复制到同一位置E: > java

  • 将Students.xsd复制到同一位置E: > java

  • 使用控制台编译XSDValidator.java。确保您的计算机上安装了 JDK 1.5 及以上版本,并且配置了类路径。关于如何使用JAVA的详细信息,请参见JAVA教程

E:\java\javac XSDValidator.java
  • 使用作为参数传递的Students.xsdStudents.xml执行XSDValidator

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

验证输出

您将看到以下结果 -

students.xml is valid against students.xsd

XSD - 简单类型

在本章中,我们将看到 XSD 定义的简单类型。

编号 简单类型和描述
1

元素

简单元素只能包含文本。它不能包含任何其他元素。

2

属性

属性本身就是一种类型,并在复杂元素中使用。

3

限制

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

XSD - 复杂类型

复杂元素是可以包含其他元素和/或属性的 XML 元素。我们可以通过两种方式创建一个复杂的元素 -

  • 定义一个复杂类型,然后使用type属性创建一个元素

  • 直接通过命名定义复杂类型

定义一个复杂类型,然后使用 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

空的

Complex 空复杂类型元素只能有属性但没有内容。

2

仅元素

Elements-Only复杂类型元素只能包含元素

3

纯文本

仅文本复杂类型元素只能包含属性和文本。

4

混合

混合复杂类型元素可以包含元素、属性和文本。

5

指标

指示器控制元素在 XML 文档中的组织方式。

6

<任意>

<any> 元素用于未由模式定义的元素

7

<任意属性>

<anyAttribute> 属性用于未由模式定义的属性。

XSD - 字符串

字符串数据类型用于表示 XML 文档中的字符。

<xs:string> 数据类型

<xs:string> 数据类型可以采用字符、换行符、回车符和制表符。XML 处理器不会用空格替换内容中的换行符、回车符和制表符并保持它们完整。例如,在显示期间保留多个空格或制表符。

<xs:字符串> 示例

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

ID参考

表示 XML 中的 IDREF 属性,并在架构属性中使用。

3

语言

代表有效的语言ID

4

姓名

代表有效的 XML 名称

5

NMT令牌

表示 XML 中的 NMTOKEN 属性,并在架构属性中使用。

6

规范化字符串

表示不包含换行符、回车符或制表符的字符串。

7

细绳

表示可以包含换行符、回车符或制表符的字符串。

8

代币

表示不包含换行符、回车符、制表符、前导空格或尾随空格或多个空格的字符串

限制

以下类型的限制可以与字符串数据类型一起使用 -

  • 枚举
  • 长度
  • 最长长度
  • 最小长度
  • 图案
  • 空白

XSD - 日期时间

日期和时间数据类型用于表示 XML 文档中的日期和时间。

<xs:日期> 数据类型

<xs:date> 数据类型用于表示 YYYY-MM-DD 格式的日期。

  • YYYY - 代表年份

  • MM - 代表月份

  • DD - 代表日

<xs:日期> 示例

XSD 中的元素声明 -

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

XML 中的元素用法 -

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

<xs:时间> 数据类型

<xs:time> 数据类型用于以 hh:mm:ss 格式表示时间。

  • hh - 代表小时

  • mm - 代表分钟

  • ss - 代表秒

<xs:时间> 示例

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:日期时间> 示例

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:持续时间> 示例

XSD 中的元素声明 -

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

使用 xml 中的元素来表示 6 年、3 个月、10 天和 15 小时的时间段。

<period>P6Y3M10DT15H</period>

日期数据类型

以下是常用日期数据类型的列表。

编号 名称和描述
1.

日期

代表日期值

2.

约会时间

表示日期和时间值

3.

期间

代表一个时间间隔

4.

将日期的一部分表示为日 (DD)

5.

将日期的一部分表示为月份 (MM)

6.

g月日

将日期的一部分表示为月和日 (MM-DD)

7.

g年

将日期的一部分表示为年份 (YYYY)

8.

g年月

将日期的一部分表示为年和月 (YYYY-MM)

9.

时间

代表一个时间值

限制

以下类型的限制可以与日期数据类型一起使用 -

  • 枚举
  • 最大独占
  • 最大包含
  • 最小独占
  • 最小包含
  • 图案
  • 空白

XSD - 数字数据类型

数字数据类型用于表示 XML 文档中的数字。

<xs:decimal> 数据类型

<xs:decimal> 数据类型用于表示数值。它支持最多 18 位的十进制数字。

<xs:十进制> 示例

XSD 中的元素声明 -

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

XML 中的元素用法 -

<score>9.12</score>

<xs:integer> 数据类型

<xs:integer> 数据类型用于表示整数值。

<xs:整数> 示例

XSD 中的元素声明 -

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

XML 中的元素用法 -

<score>9</score>

数字数据类型

以下是常用数值数据类型的列表。

编号 名称和描述
1.

字节

有符号 8 位整数

2.

小数

十进制值

3.

整数

有符号 32 位整数

4.

整数

整数值

5.

长的

有符号 64 位整数

6.

负整数

仅具有负值的整数 (..,-2,-1)

7.

非负整数

仅具有非负值的整数 (0,1,2,..)

8.

非正整数

仅具有非正值的整数 (..,-2,-1,0)

9.

正整数

仅具有正值的整数 (1,2,..)

10.

短的

有符号 16 位整数

11.

无符号长整型

无符号 64 位整数

12.

无符号整数

无符号 32 位整数

13.

无符号短整型

无符号 16 位整数

14.

无符号字节

无符号 8 位整数

限制

以下类型的限制可以与日期数据类型一起使用 -

  • 枚举
  • 分数数字
  • 最大独占
  • 最大包含
  • 最小独占
  • 最小包含
  • 图案
  • 总位数
  • 空白

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 = "http://www.tutorialspoint.com/images/smiley.jpg" />

数字数据类型

以下是常用数值数据类型的列表。

编号 名称和描述
1.

字节

有符号 8 位整数

2.

小数

十进制值

3.

整数

有符号 32 位整数

4.

整数

整数值

5.

长的

有符号 64 位整数

6.

负整数

仅具有负值的整数 (..,-2,-1)

7.

非负整数

仅具有非负值的整数 (0,1,2,..)

8.

非正整数

仅具有非正值的整数 (..,-2,-1,0)

9.

正整数

仅具有正值的整数 (1,2,..)

10.

短的

有符号 16 位整数

11.

无符号长整型

无符号 64 位整数

12.

无符号整数

无符号 32 位整数

13.

无符号短整型

无符号 16 位整数

14.

无符号字节

无符号 8 位整数

限制

以下类型的限制可以与除布尔数据类型之外的其他数据类型一起使用 -

  • 枚举
  • 长度
  • 最长长度
  • 最小长度
  • 图案
  • 空白