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

2024-05-10 05:04

本文主要是介绍XML Schema(XSD)详解:定义 XML 文档结构合法性的完整指南,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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 文档结构合法性的完整指南的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/975509

相关文章

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

Oracle查询表结构建表语句索引等方式

《Oracle查询表结构建表语句索引等方式》使用USER_TAB_COLUMNS查询表结构可避免系统隐藏字段(如LISTUSER的CLOB与VARCHAR2同名字段),这些字段可能为dbms_lob.... 目录oracle查询表结构建表语句索引1.用“USER_TAB_COLUMNS”查询表结构2.用“a

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

idea的终端(Terminal)cmd的命令换成linux的命令详解

《idea的终端(Terminal)cmd的命令换成linux的命令详解》本文介绍IDEA配置Git的步骤:安装Git、修改终端设置并重启IDEA,强调顺序,作为个人经验分享,希望提供参考并支持脚本之... 目录一编程、设置前二、前置条件三、android设置四、设置后总结一、php设置前二、前置条件

Python进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON: