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

本文涉及的产品
可观测可视化 Grafana 版,10个用户账号 1个月
应用实时监控服务-应用监控,每月50GB免费额度
应用实时监控服务-用户体验监控,每月100OCU免费额度
简介: 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,关注后即可获取最新文章推送

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

相关文章
|
3月前
|
XML 数据采集 存储
使用Java和XPath在XML文档中精准定位数据
在数据驱动的时代,从复杂结构中精确提取信息至关重要。XML被广泛用于数据存储与传输,而XPath则能高效地在这些文档中导航和提取数据。本文深入探讨如何使用Java和XPath精准定位XML文档中的数据,并通过小红书的实际案例进行分析。首先介绍了XML及其挑战,接着阐述了XPath的优势。然后,提出从大型XML文档中自动提取特定产品信息的需求,并通过代理IP技术、设置Cookie和User-Agent以及多线程技术来解决实际网络环境下的数据抓取问题。最后,提供了一个Java示例代码,演示如何集成这些技术以高效地从XML源中抓取数据。
123 7
使用Java和XPath在XML文档中精准定位数据
|
6月前
|
XML JavaScript 前端开发
属性和方法向 XML DOM 定义了编程接口
XML DOM 提供编程接口,通过属性和方法操作XML结构。使用JavaScript等语言,可访问和修改节点。属性如nodeName、nodeValue揭示节点信息,方法如getElementsByTagName、appendChild、removeChild实现查找、添加和删除节点功能。节点对象x的应用示例贯穿其中。
|
3月前
|
XML 数据格式
DTD和XML Schema之间的区别?
【8月更文挑战第22天】
66 0
|
5月前
|
Android开发 开发者
Android UI设计中,Theme定义了Activity的视觉风格,包括颜色、字体、窗口样式等,定义在`styles.xml`。
【6月更文挑战第26天】Android UI设计中,Theme定义了Activity的视觉风格,包括颜色、字体、窗口样式等,定义在`styles.xml`。要更改主题,首先在该文件中创建新主题,如`MyAppTheme`,覆盖所需属性。然后,在`AndroidManifest.xml`中应用主题至应用或特定Activity。运行时切换主题可通过重新设置并重启Activity实现,或使用`setTheme`和`recreate()`方法。这允许开发者定制界面并与品牌指南匹配,或提供多主题选项。
82 6
|
5月前
|
XML JavaScript 前端开发
属性和方法向 XML DOM 定义了编程接口
XML DOM 是一个编程接口,它将XML表示为节点对象集合,可通过JavaScript等语言访问。接口通过属性和方法定义,属性如nodeName、nodeValue显示节点信息,方法如getElementsByTagName、appendChild、removeChild执行操作。例如,x.nodeName返回节点名称,x.appendChild(node)添加子节点。
|
6月前
|
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;`来组织元素和属性。
235 7
|
6月前
|
XML 存储 C#
C# xml文档反序列化记事
本文介绍了使用XmlSerializer进行XML序列化和反序列化的关键点。包括:1) 以独占方式读取XML文件以避免并发问题;2) 当元素名与类型名不一致时,可通过`[XmlArrayItem]`指定元素名,或创建继承自原始类型的子类;3) 处理DateTime反序列化错误,通过中间字符串属性转换;4) 提到了常用C#特性如`[XmlRoot]`, `[XmlElement]`, `[XmlAttribute]`, `[XmlIgnore]`和`[XmlArrayItem]`的作用。
|
6月前
|
XML 数据格式
XML Schema 字符串数据类型及约束详解
XML中的字符串数据类型表示字符序列,包括换行、回车和制表符。处理器不修改值。`normalizedString`去除这些特殊字符,`token`则进一步移除前导和尾随空格及多余空格。字符串类型可使用枚举、长度等限制。`date`和`dateTime`数据类型表示日期和时间,`duration`表示时间间隔。数值类型如`decimal`和`integer`用于数值,布尔型表示真或假。还有如`base64Binary`和`anyURI`等其他数据类型。元素和数据类型可以有各种约束,如最大值、最小值和模式匹配。
91 0
|
1月前
|
XML 前端开发 Java
讲解SSM的xml文件
本文详细介绍了SSM框架中的xml配置文件,包括springMVC.xml和applicationContext.xml,涉及组件扫描、数据源配置、事务管理、MyBatis集成以及Spring MVC的视图解析器配置。
57 1
|
3月前
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)