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

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
可观测可视化 Grafana 版,10个用户账号 1个月
简介: XML Schema(XSD)是用于定义XML文档结构的规范,它描述了元素、属性及其顺序、数据类型和约束。与DTD相比,XML Schema支持更多数据类型,如字符串、日期等,并且是基于XML的,允许扩展和重用。学习XML Schema有助于确保数据通信时双方对内容的理解一致,通过验证防止错误。示例展示了如何定义一个`note`元素,包含`to`, `from`, `heading`和`body`子元素,都是字符串类型。XML文档可以通过引用XML Schema进行验证,确保内容符合预设模式。

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,关注后即可获取最新文章推送

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

相关文章
|
5天前
|
XML 存储 JavaScript
DOM 节点遍历:掌握遍历 XML文档结构和内容的技巧
**XML DOM 遍历、操作和导航概述** - 遍历XML节点树用于提取信息,例如,通过JavaScript的DOM API循环`&lt;book&gt;`子节点显示名称和值。 - DOM解析器处理XML文本数据,包括解析字符数据(PCDATA)和识别CDATA段。 - 节点导航涉及`parentNode`、`childNodes`等属性,`get_nextSibling`等辅助函数避免空文本节点。 - `getElementsByTagName`、`getAttribute`和`nodeValue`用于检索元素、属性值和文本。
43 6
DOM 节点遍历:掌握遍历 XML文档结构和内容的技巧
|
5天前
|
XML 存储 数据格式
什么是 XML 文件的 Schema
什么是 XML 文件的 Schema
34 0
|
2天前
|
XML 数据格式
XML Schema 复杂元素类型详解:定义及示例解析
在XML Schema(XSD)中,复杂元素包含其他元素和/或属性,分为4类:空元素、仅含元素、仅含文本和既含元素也含文本。定义复杂元素可通过直接声明或引用预定义的复杂类型。复杂空元素仅含属性,而仅含元素的类型则只包含其他子元素。XSD提供了`&lt;xs:sequence&gt;`、`&lt;xs:all&gt;`、`&lt;xs:choice&gt;`等指示器来规定元素顺序和出现次数,以及`&lt;xs:attributeGroup&gt;`和`&lt;xs:group&gt;`来组织元素和属性。
130 7
|
5天前
|
XML 存储 数据格式
探索 DTD 在 XML 中的作用及解析:深入理解文档类型定义
DTD(文档类型定义)用于定义XML文档的结构和合法元素、属性。它允许不同团体就数据交换标准达成一致,并用于验证XML数据的有效性。DTD可通过内部声明(在XML文档内)或外部声明(在单独文件中)来定义。内部声明示例显示了如何定义`note`元素及其子元素的结构,而外部声明则引用外部DTD文件。元素、属性、实体和PCDATA/CDATA是XML构建模块。DTD中,元素通过ELEMENT声明定义,属性通过ATTLIST声明定义,实体声明提供特殊字符或外部资源的快捷方式。
16 0
|
5天前
|
XML JavaScript 前端开发
XML文档节点导航与选择指南
XPath是XSLT的核心部分,用于XML文档的节点定位和选择。它采用路径表达式语法,包含200多个内置函数处理各种数据类型。XPath在编程语言如JavaScript中广泛使用,与XSLT配合进行XML转换和样式处理。它涉及7种节点类型,如元素、属性和文本,以及多种节点间关系,如父、子、同级等。XPath还使用轴(如ancestor、child)来描述节点间的关联,并支持运算符进行逻辑和数学操作。
28 0
XML文档节点导航与选择指南
|
5天前
|
XML 数据格式
小米备份descript.xml文件
小米备份descript.xml文件
25 0
|
5天前
|
XML Java 数据库连接
mybatis中在xml文件中通用查询结果列如何使用
mybatis中在xml文件中通用查询结果列如何使用
42 0
|
5天前
|
XML JavaScript 前端开发
xml文件使用及解析
xml文件使用及解析
|
5天前
|
SQL
Mybatis.xml文件中大于小于等于
Mybatis.xml文件中大于小于等于
12 0
|
5天前
|
XML 关系型数据库 MySQL
【Mysql】有关数据库中一对多/一对一,多对一xml中文件映射问题
【Mysql】有关数据库中一对多/一对一,多对一xml中文件映射问题
20 0

相关课程

更多