XML Schema描述了 XML 文档的结构。XML Schema语言也称为 XML Schema Definition(XSD)。

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="note">
<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string"/>
<xs:element name="from" type="xs:string"/>
<xs:element name="heading" type="xs:string"/>
<xs:element name="body" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element> </xs:schema>

XML Schema的目的是定义 XML 文档的合法构建块

  • 可以出现在文档中的元素和属性
  • 子元素的数量(和顺序)
  • 元素和属性的数据类型
  • 元素和属性的默认和固定值

为什么要学习 XML Schema

在 XML 世界中,每天都在使用数百种标准化的 XML 格式。其中许多 XML 标准是由 XML Schema 定义的。XML Schema 是 DTD 的基于 XML 的(更强大的)替代品。

XML Schema支持数据类型

XML Schema的最大优势之一是对数据类型的支持。

  • 更容易描述文档内容的合法性
  • 更容易验证数据的正确性
  • 更容易定义数据约束(对数据的限制)
  • 更容易定义数据模式(数据格式)
  • 更容易在不同数据类型之间转换数据

XML Schema使用 XML 语法

XML Schema的另一个强大之处在于它们是用 XML 编写的。

  • 无需学习新语言
  • 可以使用 XML DOM 操纵模式
  • 可以使用 XSLT 转换模式

XML Schema是可扩展的,因为它们是用 XML 编写的。使用可扩展的模式定义,您可以:

  • 在其他模式中重用模式
  • 从标准类型派生自己的数据类型
  • 在同一文档中引用多个模式

XML Schema保障数据通信

从发送方发送数据到接收方时,必须确保两者对内容有相同的“期望”。使用 XML Schema,发送方可以以接收方能理解的方式描述数据。

例如,日期“03-11-2004”在某些国家可能被解释为11月3日,在其他国家可能被解释为3月11日。然而,具有这样数据类型的 XML 元素:

<date type="date">2004-03-11</date>

确保了对内容的相互理解,因为 XML 数据类型“date”要求使用“YYYY-MM-DD”格式。

仅仅是格式正确是不够的

格式良好的 XML 文档是符合 XML 语法规则的文档,例如:

  • 必须以 XML 声明开头
  • 必须有一个唯一的根元素
  • 开始标签必须有匹配的结束标签
  • 元素区分大小写
  • 所有元素必须关闭
  • 所有元素必须正确嵌套
  • 所有属性值必须用引号括起来
  • 特殊字符必须使用实体

即使文档格式良好,它们仍然可能包含错误,而这些错误可能会产生严重的后果。考虑以下情况:您订购了5大毛的激光打印机,而不是5台激光打印机。使用 XML Schema,大多数这类错误可以被验证软件捕捉到。

XSD如何使用

XML 文档可以引用 DTD 或 XML Schema。

简单的 XML 文档

考虑这个简单的 XML 文档,名为"note.xml":

<?xml version="1.0"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

下面的例子是一个名为"note.dtd"的 DTD 文件,定义了上面 XML 文档("note.xml")的元素:

<!ELEMENT note (to, from, heading, body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

XML Schema

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

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="note">
<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string"/>
<xs:element name="from" type="xs:string"/>
<xs:element name="heading" type="xs:string"/>
<xs:element name="body" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element> </xs:schema>

note 元素是一个复杂类型,因为它包含其他元素。其他元素(to, from, heading, body)是简单类型,因为它们不包含其他元素。

对 DTD 的引用

这个 XML 文档引用了一个 DTD:

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

对 XML Schema 的引用

XSD - <schema> 元素

<schema> 元素是每个 XML Schema 的根元素。

<schema> 元素

<schema> 元素是每个 XML Schema 的根元素:

指示 XML 实例文档中使用的任何在此模式中声明的元素必须是命名空间限定的。

在 XML 文档中引用模式

这个 XML 文档引用了一个 XML Schema:

<?xml version="1.0"?>
<note xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="note.xsd">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

指定了默认命名空间声明。该声明告诉模式验证器

一旦有了 XML Schema Instance 命名空间:

您就可以使用 schemaLocation 属性。此属性有两个值,用空格分隔。第一个值是要使用的命名空间。第二个值是要用于该命名空间的 XML 模式的位置:

XSD 简单元素

XML 模式定义了 XML 文件中的元素。

简单元素是仅包含文本的 XML 元素。它不能包含任何其他元素或属性。

什么是简单元素

简单元素是仅包含文本的 XML 元素。它不能包含任何其他元素或属性。

然而,“仅文本”限制相当具有误导性。文本可以是许多不同类型之一。它可以是 XML 模式定义中包含的类型之一(布尔值、字符串、日期等),或者它可以是您自己定义的自定义类型。

您还可以向数据类型添加限制(facet)以限制其内容,或者您可以要求数据匹配特定模式

定义简单元素的语法为

<xs:element name="xxx" type="yyy"/>
其中 xxx 是元素的名称,yyy 是元素的数据类型。 XML 模式具有许多内置数据类型。最常见的类型包括: xs:string
xs:decimal
xs:integer
xs:boolean
xs:date

示例

以下是一些 XML 元素

<lastname>Refsnes</lastname>
<age>36</age>
<dateborn>1970-03-27</dateborn>
以下是相应的简单元素定义: <xs:element name="lastname" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
<xs:element name="dateborn" type="xs:date"/>

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

简单元素可以具有指定的默认值或固定值。

当未指定其他值时,默认值会自动分配给元素

在以下示例中,默认值为 "red":

<xs:element name="color" type="xs:string" default="red"/>

固定值也会自动分配给元素,并且您无法指定其他值。

在以下示例中,固定值为 "red":

<xs:element name="color" type="xs:string" fixed="red"/>

XSD 属性

所有属性都声明为简单类型

简单元素不能具有属性。如果一个元素具有属性,则被视为复杂类型。但是属性本身始终被声明为简单类型。

如何定义属性

定义属性的语法为

<xs:attribute name="xxx" type="yyy"/>

其中 xxx 是属性的名称,yyy 指定了属性的数据类型。

XML 模式具有许多内置数据类型。最常见的类型包括:

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

示例, 以下是具有属性的 XML 元素

<lastname lang="EN">Smith</lastname>

以下是相应的属性定义

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

属性的默认值和固定值

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

当未指定其他值时,默认值会自动分配给属性。

在以下示例中,默认值为 "EN":

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

固定值也会自动分配给属性,并且您无法指定其他值。

在以下示例中,固定值为 "EN":

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

可选和必需的属性

属性默认为可选。要指定属性为必需的,请使用 "use" 属性:

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

对内容的限制

当 XML 元素或属性具有定义的数据类型时,它会对元素或属性的内容施加限制。

如果 XML 元素的类型为 "xs:date",并包含类似 "Hello World" 的字符串,则该元素将无法验证。

使用 XML 模式,您还可以向 XML 元素和属性添加自定义限制。这些限制称为 facets。您可以在下一章中了解更多关于 facets 的信息。

XSD 限制/约束

限制用于定义 XML 元素或属性的可接受值。对 XML 元素的限制称为 facets。

对值的限制

以下示例定义了一个名为 "age" 的元素,并施加了限制。age 的值不能小于 0 或大于 120:

<xs:element name="age">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="120"/>
</xs:restriction>
</xs:simpleType>
</xs:element>

对一组值的限制要将 XML 元素的内容限制为一组可接受的值,我们将使用枚举约束

以下示例定义了一个名为 "car" 的元素,并施加了限制。唯一可接受的值是:Audi、Golf、BMW

<xs:element name="car">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Audi"/>
<xs:enumeration value="Golf"/>
<xs:enumeration value="BMW"/>
</xs:restriction>
</xs:simpleType>
</xs:element>

上述示例也可以这样写:

<xs:element name="car" type="carType"/>

<xs:simpleType name="carType">
<xs:restriction base="xs:string">
<xs:enumeration value="Audi"/>
<xs:enumeration value="Golf"/>
<xs:enumeration value="BMW"/>
</xs:restriction>
</xs:simpleType>

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

对一系列值的限制

要将 XML 元素的内容限制为定义的一系列数字或字母,我们将使用模式约束。

以下示例定义了一个名为 "letter" 的元素,并施加了限制。唯一可接受的值是小写字母 a 到 z 中的任意一个:

<xs:element name="letter">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-z]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>

下一个示例定义了一个名为 "initials" 的元素,并施加了限制。唯一可接受的值是小写或大写字母 a 到 z 中的三个:

<xs:element name="initials">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[A-Z][A-Z][A-Z]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>

下一个示例也定义了一个名为 "initials" 的元素,并施加了限制。唯一可接受的值是小写或大写字母 a 到 z 中的三个:

<xs:element name="initials">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-zA-Z][a-zA-Z][a-zA-Z]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>

下一个示例定义了一个名为 "choice" 的元素,并施加了限制。唯一可接受的值是以下字母中的一个:x、y 或 z:

<xs:element name="choice">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[xyz]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>

下一个示例定义了一个名为 "prodid" 的元素,并施加了限制。唯一可接受的值是一个连续的五位数字,每个数字必须在 0 到 9 的范围内:

<xs:element name="prodid">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:pattern value="[0-9][0-9][0-9][0-9][0-9]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>

以下示例定义了一个名为 "letter" 的元素,并施加了限制。可接受的值是小写字母 a 到 z 的零个或多个实例:

<xs:element name="letter">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="([a-z])*"/>
</xs:restriction>
</xs:simpleType>
</xs:element>

下一个示例也定义了一个名为 "letter" 的元素,并施加了限制。可接受的值是一个或多个成对的字母,每个成对由一个小写字母后跟一个大写字母组成。例如,"sToP" 将通过此模式验证,但 "Stop"、"STOP" 或 "stop" 不会:

<xs:element name="letter">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="([a-z][A-Z])+"/>
</xs:restriction>
</xs:simpleType>
</xs:element>

下一个示例定义了一个名为 "gender" 的元素,并施加了限制。唯一可接受的值是 male 或 female:

<xs:element name="gender">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="male|female"/>
</xs:restriction>
</xs:simpleType>
</xs:element>

以下示例定义了一个名为 "password" 的元素,并施加了限制。必须连续存在八个字符,这些字符必须是小写或大写字母 a 到 z 中的一个,或者数字 0 到 9:

<xs:element name="password">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-zA-Z0-9]{8}"/>
</xs:restriction>
</xs:simpleType>
</xs:element>

要指定如何处理空白字符,我们将使用 whiteSpace 约束。

以下示例定义了一个名为 "address" 的元素,并施加了限制。whiteSpace 约束设置为 "preserve",这意味着 XML 处理器不会移除任何空白字符:

<xs:element name="address">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="preserve"/>
</xs:restriction>
</xs:simpleType>
</xs:element>

这个示例也定义了一个名为 "address" 的元素,并施加了限制。whiteSpace 约束设置为 "replace",这意味着 XML 处理器将替换所有空白字符(换行符、制表符、空格和回车)为空格:

<xs:element name="address">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="replace"/>
</xs:restriction>
</xs:simpleType>
</xs:element>

这个示例也定义了一个名为 "address" 的元素,并施加了限制。whiteSpace 约束设置为 "collapse",这意味着 XML 处理器将移除所有空白字符(换行符、制表符、空格和回车被替换为空格,前导和尾随空格被移除,多个空格被减少为单个空格):

<xs:element name="address">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
</xs:element>

长度限制

要限制元素中值的长度,我们将使用 length、maxLength 和 minLength 约束。

以下示例定义了一个名为 "password" 的元素,并施加了限制。值必须正好为八个字符:

<xs:element name="password">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="8"/>
</xs:restriction>
</xs:simpleType>
</xs:element>

这个示例定义了另一个名为 "password" 的元素,并施加了限制。值必须至少五个字符,最多八个字符:

<xs:element name="password">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="5"/>
<xs:maxLength value="8"/>
</xs:restriction>
</xs:simpleType>
</xs:element>

数据类型的限制

约束 描述

enumeration 定义可接受值列表

fractionDigits 指定允许的最大小数位数。必须大于或等于零

length 指定允许的精确字符数或列表项数。必须大于或等于零

maxExclusive 指定数值的上界(值必须小于此值)

maxInclusive 指定数值的上限(值必须小于或等于此值)

maxLength 指定允许的最大字符数或列表项数。必须大于或等于零

minExclusive 指定数值的下界(值必须大于此值)

minInclusive 指定数值的下限(值必须大于或等于此值)

minLength 指定允许的最小字符数或列表项数。必须大于或等于零

pattern 定义可接受的确切字符序列

totalDigits 指定允许的精确数字数。必须大于零

whiteSpace 指定如何处理空白字符(换行符、制表符、空格和回车)

最后

为了方便其他设备和平台的小伙伴观看往期文章:

微信公众号搜索:Let us Coding,关注后即可获取最新文章推送

看完如果觉得有帮助,欢迎点赞、收藏、关注

XML Schema(XSD)详解:定义 XML 文档结构合法性的完整指南的更多相关文章

  1. 详解在Word文档中常见的各种公式编辑问题

    正常情况下,我们在安装完成MathType之后会直接加载在Word文档中,Word文档中的MathType比较复杂,新手操作遇到麻烦也是常有的事,今天就来给大家详解下Word文档中常见的MathTyp ...

  2. 详解微信开发者文档——5 access_token管理

    写在前面的话:前几篇博客详细讲解了如何获取用户发送的消息并进行回复,这里的回复是一种被动的回复,而被动回复的方式便是通过echo返回信息给微信服务器的POST请求,因此,其实我们并没有算的上调用了微信 ...

  3. XSD详解一 - 基本概念

    本分类下的文章主要是对W3School的文档进行整理:http://www.w3school.com.cn/x.asp XML Schema 是基于 XML 的 DTD 替代者. XML Schema ...

  4. 史上最全的maven pom.xml文件教程详解

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  5. XML DTD语法详解

    XML DTD详解   XML DTD详解 前情提要与本文内容介绍 前面的两篇XML相关博文: 第一篇是介绍格式正规的XML: 格式正规的XML:语法 属性 实体 处理指令 样式单 CDATA节 第二 ...

  6. MyEclipse XML & XML架构教程:XML Schema (XSD)编辑器

    [MyEclipse CI 2019.4.0安装包下载] 1. MyEclipse中的XSD编辑 本文档介绍MyEclipse XML Schema(XSD)编辑器中的一些可用函数.XML Schem ...

  7. res文件夹及xml资源文件详解

    目录 一.values文件:存放字符串(strings).颜色(colors).尺寸(dimens).数组(arrays).样式(styles类似于CSS文件).类型等资源 二.drawable:存放 ...

  8. web.xml常用配置详解

    web.xml常用配置详解 context-param 指定 ServletContext(上下文) 配置文件路径,基本配置一般是Spring配置文件,或者是spring-security的配置文件. ...

  9. crossdomain.xml的配置详解

    目录 1 简介 2 crossdomain.xml的配置详解 3 总结 1 简介 flash在跨域时唯一的限制策略就是crossdomain.xml文件,该文件限制了flash是否可以跨域读写数据以及 ...

  10. logback logback.xml常用配置详解(三)

    logback logback.xml常用配置详解 <filter> <filter>: 过滤器,执行一个过滤器会有返回个枚举值,即DENY,NEUTRAL,ACCEPT其中之 ...

随机推荐

  1. vector优化

    C++的stdvector使用优化 #include<iostream> #include<vector> using namespace std; class Vectex ...

  2. 创业:大模型RAG系统三个月的开发心得和思考

    1. 前言 自从和员外上家公司离职后,我们就自己搞公司投入到了RAG大模型的AI产品应用的开发中,这中间有一个春节,前后的总时间大概是三个月左右,在这三个月期间,基本是昼夜兼程啊,到今天3月底结束,产 ...

  3. #树上启发式合并,trie#JZOJ 5363 生命之树

    分析 考虑按位处理, 如果熟悉dsu的话可以发现这道题能够用dsu做, 再用两个trie分别维护该位为0或1的字符串, 重儿子可以按照子树字符串的总长计算 代码 #include <cstdio ...

  4. 【中秋国庆不断更】OpenHarmony组件内状态变量使用:@State装饰器

    [中秋国庆不断更]OpenHarmony组件内状态变量使用:@State装饰器 @State装饰的变量,或称为状态变量,一旦变量拥有了状态属性,就和自定义组件的渲染绑定起来.当状态改变时,UI会发生对 ...

  5. 一种基于DeltaE(CIE 1976)的找色算法

    // QuickFinder.cpp : 此文件包含 "main" 函数.程序执行将在此处开始并结束. // #include <iostream> #define _ ...

  6. Linux 配置Git

    前言:请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 一.用git --version命令检查是否已经安装 二.下载git源码并解压 wget https://github.com/git/ ...

  7. selenium 关闭浏览--- close 与 quit 的区别

    selenium 关闭浏览器,有两种方式 close quit 既然都是关闭浏览器,为什么要写两种方式? 区别 close: close只是关闭浏览器,但是不会退出 webdriver quit: q ...

  8. MogDB 使用向量化执行引擎进行调优

    MogDB 使用向量化执行引擎进行调优 本文出处:https://www.modb.pro/db/430318 MogDB 数据库支持行执行引擎和向量化执行引擎,分别对应行存表和列存表. 一次一个 b ...

  9. IIS 出现405

    前言 在一次配置服务器中,出现一个问题,那就是使用put和delete 出现405. 当时我蒙了,调试的时候好好的,部署405. 原因是put和delete是非简单请求,也就是说非安全请求了. 这时候 ...

  10. 距离传感器GT2的使用介绍

    一. 1.使用注意要点: (1)要使用到"清零"功能. 确定其内部清零软元件,认准"外部请求",注意组别容易混淆. (2)如果要用到"复位" ...