• XSD 初学


    一、前言

    XML Schema 是基于 XML 的 DTD 替代者。

    XML Schema 描述 XML 文档的结构。

    XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。

    您应当具备的基础知识

    在继续学习之前,您需要对下面的知识有基本的了解:

    • HTML / XHTML
    • XML 以及 XML 命名空间
    • 对 DTD 的基本了解

    二、简介

    什么是 XML Schema?

    XML Schema 的作用是定义 XML 文档的合法构建模块,类似 DTD。

    XML Schema:

    • 定义可出现在文档中的元素
    • 定义可出现在文档中的属性
    • 定义哪个元素是子元素
    • 定义子元素的次序
    • 定义子元素的数目
    • 定义元素是否为空,或者是否可包含文本
    • 定义元素和属性的数据类型
    • 定义元素和属性的默认值以及固定值

    XML Schema 是 DTD 的继任者

    我们认为 XML Schema 很快会在大部分网络应用程序中取代 DTD。

    理由如下:

    • XML Schema 可针对未来的需求进行扩展
    • XML Schema 更完善,功能更强大
    • XML Schema 基于 XML 编写
    • XML Schema 支持数据类型
    • XML Schema 支持命名空间

    XML Schema 是 W3C 标准

    XML Schema 在 2001 年 5 月 2 日成为 W3C 标准。

    您可以在我们的《W3C 教程》中获得更多有关 XML Schema 标准的信息。

    为什么要使用 XML Schema?

    XML Schema 支持数据类型

    XML Schema 最重要的能力之一就是对数据类型的支持。

    通过对数据类型的支持:

    • 可更容易地描述允许的文档内容
    • 可更容易地验证数据的正确性
    • 可更容易地与来自数据库的数据一并工作
    • 可更容易地定义数据约束(data facets)
    • 可更容易地定义数据模型(或称数据格式)
    • 可更容易地在不同的数据类型间转换数据

    编者注:数据约束,或称 facets,是 XML Schema 原型中的一个术语,中文可译为“面”,用来约束数据类型的容许值。

    XML Schema 使用 XML 语法

    另一个关于 XML Schema 的重要特性是,它们由 XML 编写。

    由 XML 编写 XML Schema 有很多好处:

    • 不必学习新的语言
    • 可使用 XML 编辑器来编辑 Schema 文件
    • 可使用 XML 解析器来解析 Schema 文件
    • 可通过 XML DOM 来处理 Schema
    • 可通过 XSLT 来转换 Schema

    XML Schema 可保护数据通信

    当数据从发送方被发送到接受方时,其要点是双方应有关于内容的相同的“期望值”。

    通过 XML Schema,发送方可以用一种接受方能够明白的方式来描述数据。

    一种数据,比如 "03-11-2004",在某些国家被解释为11月3日,而在另一些国家为当作3月11日。

    但是一个带有数据类型的 XML 元素,比如:2004-03-11,可确保对内容一致的理解,这是因为 XML 的数据类型 "date" 要求的格式是 "YYYY-MM-DD"。

    XML Schema 可扩展

    XML Schema 是可扩展的,因为它们由 XML 编写。

    通过可扩展的 Schema 定义,您可以:

    • 在其他 Schema 中重复使用您的 Schema
    • 创建由标准类型衍生而来的您自己的数据类型
    • 在相同的文档中引用多重的 Schema

    形式良好是不够的

    我们把符合 XML 语法的文档称为形式良好的 XML 文档,比如:

    • 它必须以 XML 声明开头
    • 它必须拥有唯一的根元素
    • 开始标签必须与结束标签相匹配
    • 元素对大小写敏感
    • 所有的元素都必须关闭
    • 所有的元素都必须正确地嵌套
    • 必须对特殊字符使用实体

    即使文档的形式良好,仍然不能保证它们不会包含错误,并且这些错误可能会产生严重的后果。

    请考虑下面的情况:您订购的了 5 打激光打印机,而不是 5 台。通过 XML Schema,大部分这样的错误会被您的验证软件捕获到。

    三、如何使用 XSD?

    XML 文档可对 DTD 或 XML Schema 进行引用。

    一个简单的 XML 文档:

    请看这个名为 "note.xml" 的 XML 文档:

    
    
    George
    John
    Reminder
    Don't forget the meeting!
    

    DTD 文件

    下面这个例子是名为 "note.dtd" 的 DTD 文件,它对上面那个 XML 文档的元素进行了定义:

    
    
    
    
    

    第 1 行定义 note 元素有四个子元素:"to, from, heading, body"。

    第 2-5 行定义了 to, from, heading, body 元素的类型是 "#PCDATA"。

    XML Schema

    下面这个例子是一个名为 "note.xsd" 的 XML Schema 文件,它定义了上面那个 XML 文档的元素:

    
    
    
    
        
          
    	
    	
    	
    	
          
        
    
    
    

    note 元素是一个复合类型,因为它包含其他的子元素。其他元素 (to, from, heading, body) 是简易类型,因为它们没有包含其他元素。您将在下面的章节学习更多有关复合类型和简易类型的知识。

    四、XSD - 元素

    元素是每一个 XML Schema 的根元素。

    元素

    元素是每一个 XML Schema 的根元素:

    
    
    
    
    ...
    ...
    
    

    元素可包含属性。一个 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 文档中引用 Schema

    此 XML 文档含有对 XML Schema 的引用:

    
    
    
    
    George
    John
    Reminder
    Don't forget the meeting!
    

    代码解释:

    下面的片断:

    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 Schema 可定义 XML 文件的元素。

    简易元素指那些只包含文本的元素。它不会包含任何其他的元素或属性。

    什么是简易元素?

    简易元素指那些仅包含文本的元素。它不会包含任何其他的元素或属性。

    不过,“仅包含文本”这个限定却很容易造成误解。文本有很多类型。它可以是 XML Schema 定义中包括的类型中的一种(布尔、字符串、数据等等),或者它也可以是您自行定义的定制类型。

    您也可向数据类型添加限定(即 facets),以此来限制它的内容,或者您可以要求数据匹配某种特定的模式。

    定义简易元素

    定义简易元素的语法:

    此处 xxx 指元素的名称,yyy 指元素的数据类型。XML Schema 拥有很多内建的数据类型。

    最常用的类型是:

    • xs:string
    • xs:decimal
    • xs:integer
    • xs:boolean
    • xs:date
    • xs:time

    例子:

    这是一些 XML 元素:

    1. <lastname>Smithlastname>
    2. <age>28age>
    3. <dateborn>1980-03-27dateborn>

    这是相应的简易元素定义:

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

    简易元素的默认值和固定值

    简易元素可拥有指定的默认值或固定值。

    当没有其他的值被规定时,默认值就会自动分配给元素。

    在下面的例子中,缺省值是 "red":

    固定值同样会自动分配给元素,并且您无法规定另外一个值。

    在下面的例子中,固定值是 "red":

    六、XSD 属性

    什么是属性?

    简易元素无法拥有属性。假如某个元素拥有属性,它就会被当作某种复合类型。但是属性本身总是作为简易类型被声明的。

    如何声明属性?

    定义属性的语法是:

    在此处,xxx 指属性名称,yyy 则规定属性的数据类型。XML Schema 拥有很多内建的数据类型。

    最常用的类型是:

    • xs:string
    • xs:decimal
    • xs:integer
    • xs:boolean
    • xs:date
    • xs:time

    实例

    这是带有属性的 XML 元素:

    <lastname lang="EN">Smithlastname>

    这是对应属性的定义:

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

    属性的默认值和固定值

    属性可拥有指定的默认值或固定值。

    当没有其他的值被规定时,默认值就会自动分配给元素。

    在下面的例子中,缺省值是 "EN":

    固定值同样会自动分配给元素,并且您无法规定另外的值。

    在下面的例子中,固定值是 "EN":

    可选的和必需的属性

    在缺省的情况下,属性是可选的。如需规定属性为必选,请使用 "use" 属性:

    对内容的限定

    当 XML 元素或属性拥有被定义的数据类型时,就会向元素或属性的内容添加限定。

    假如 XML 元素的类型是 "xs:date",而其包含的内容是类似 "Hello World" 的字符串,元素将不会(通过)验证。

    通过 XML schema,您也可向您的 XML 元素及属性添加自己的限定。这些限定被称为 facet(编者注:意为(多面体的)面,可译为限定面)。您会在下一节了解到更多有关 facet 的知识。

    七、XSD 限定 / Facets

    限定(restriction)用于为 XML 元素或者属性定义可接受的值。对 XML 元素的限定被称为 facet。

    对值的限定

    下面的例子定义了带有一个限定且名为 "age" 的元素。age 的值不能低于 0 或者高于 120:

    1. <xs:element name="age">
    2. <xs:simpleType>
    3. <xs:restriction base="xs:integer">
    4. <xs:minInclusive value="0"/>
    5. <xs:maxInclusive value="120"/>
    6. xs:restriction>
    7. xs:simpleType>
    8. xs:element>

    对一组值的限定

    如需把 XML 元素的内容限制为一组可接受的值,我们要使用枚举约束(enumeration constraint)。

    下面的例子定义了带有一个限定的名为 "car" 的元素。可接受的值只有:Audi, Golf, BMW:

    1. <xs:element name="car">
    2. <xs:simpleType>
    3. <xs:restriction base="xs:string">
    4. <xs:enumeration value="Audi"/>
    5. <xs:enumeration value="Golf"/>
    6. <xs:enumeration value="BMW"/>
    7. xs:restriction>
    8. xs:simpleType>
    9. xs:element>

    上面的例子也可以被写为:

    1. <xs:element name="car" type="carType"/>
    2. <xs:simpleType name="carType">
    3. <xs:restriction base="xs:string">
    4. <xs:enumeration value="Audi"/>
    5. <xs:enumeration value="Golf"/>
    6. <xs:enumeration value="BMW"/>
    7. xs:restriction>
    8. xs:simpleType>

    注释:在这种情况下,类型 "carType" 可被其他元素使用,因为它不是 "car" 元素的组成部分。

    对一系列值的限定

    如需把 XML 元素的内容限制定义为一系列可使用的数字或字母,我们要使用模式约束(pattern constraint)。

    下面的例子定义了带有一个限定的名为 "letter" 的元素。可接受的值只有小写字母 a - z 其中的一个:

    
    
    
      
        
      
    
    
     

    下一个例子定义了带有一个限定的名为 "initials" 的元素。可接受的值是大写字母 A - Z 其中的三个:

    
    
    
      
        
      
    
    
     

    下一个例子也定义了带有一个限定的名为 "initials" 的元素。可接受的值是大写或小写字母 a - z 其中的三个:

    
    
    
      
        
      
    
    
     

    下一个例子定义了带有一个限定的名为 "choice 的元素。可接受的值是字母 x, y 或 z 中的一个:

    
    
    
      
        
      
    
    
     

    下一个例子定义了带有一个限定的名为 "prodid" 的元素。可接受的值是五个阿拉伯数字的一个序列,且每个数字的范围是 0-9:

    
    
    
      
        
      
    
    
     

    对一系列值的其他限定

    下面的例子定义了带有一个限定的名为 "letter" 的元素。可接受的值是 a - z 中零个或多个字母:

    
    
    
      
        
      
    
    
     

    下面的例子定义了带有一个限定的名为 "letter" 的元素。可接受的值是一对或多对字母,每对字母由一个小写字母后跟一个大写字母组成。举个例子,"sToP"将会通过这种模式的验证,但是 "Stop"、"STOP" 或者 "stop" 无法通过验证:

    
    
    
      
        
      
    
    
     

    下面的例子定义了带有一个限定的名为 "gender" 的元素。可接受的值是 male 或者 female:

    
    
    
      
        
      
    
    
     

    下面的例子定义了带有一个限定的名为 "password" 的元素。可接受的值是由 8 个字符组成的一行字符,这些字符必须是大写或小写字母 a - z 亦或数字 0 - 9:

    
    
    
      
        
      
    
    
     

    对空白字符的限定

    如需规定对空白字符(whitespace characters)的处理方式,我们需要使用 whiteSpace 限定。

    下面的例子定义了带有一个限定的名为 "address" 的元素。这个 whiteSpace 限定被设置为 "preserve",这意味着 XML 处理器不会移除任何空白字符:

    
    
    
      
        
      
    
    
     

    这个例子也定义了带有一个限定的名为 "address" 的元素。这个 whiteSpace 限定被设置为 "replace",这意味着 XML 处理器将移除所有空白字符(换行、回车、空格以及制表符):

    
    
    
      
        
      
    
    
     

    这个例子也定义了带有一个限定的名为 "address" 的元素。这个 whiteSpace 限定被设置为 "collapse",这意味着 XML 处理器将移除所有空白字符(换行、回车、空格以及制表符会被替换为空格,开头和结尾的空格会被移除,而多个连续的空格会被缩减为一个单一的空格):

    
    
    
      
        
      
    
    
     

    对长度的限定

    如需限制元素中值的长度,我们需要使用 length、maxLength 以及 minLength 限定。

    本例定义了带有一个限定且名为 "password" 的元素。其值必须精确到 8 个字符:

    
    
    
      
        
      
    
    
     

    这个例子也定义了带有一个限定的名为 "password" 的元素。其值最小为 5 个字符,最大为 8 个字符:

    
    
    
      
        
        
      
    
    
     

    数据类型的限定

    限定描述
    enumeration定义可接受值的一个列表
    fractionDigits定义所允许的最大的小数位数。必须大于等于0。
    length定义所允许的字符或者列表项目的精确数目。必须大于或等于0。
    maxExclusive定义数值的上限。所允许的值必须小于此值。
    maxInclusive定义数值的上限。所允许的值必须小于或等于此值。
    maxLength定义所允许的字符或者列表项目的最大数目。必须大于或等于0。
    minExclusive定义数值的下限。所允许的值必需大于此值。
    minInclusive定义数值的下限。所允许的值必需大于或等于此值。
    minLength定义所允许的字符或者列表项目的最小数目。必须大于或等于0。
    pattern定义可接受的字符的精确序列。
    totalDigits定义所允许的阿拉伯数字的精确位数。必须大于0。
    whiteSpace定义空白字符(换行、回车、空格以及制表符)的处理方式。
  • 相关阅读:
    springboot+vue土家风景文化旅游景点攻略网站java
    python连接postgresql数据库及操作
    The following method did not exist (maven依赖冲突解决全记录)
    前端安全方面
    Android 得到安装包的信息
    HTML开篇之安装VSvode(用记事本编辑HTML)
    超分辨率重建DRRN
    竞赛选题 基于机器视觉的停车位识别检测
    华为FinalMLP
    linux软件包管理
  • 原文地址:https://blog.csdn.net/weixin_42646630/article/details/126537613