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

相关文章

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

详解MySQL中DISTINCT去重的核心注意事项

《详解MySQL中DISTINCT去重的核心注意事项》为了实现查询不重复的数据,MySQL提供了DISTINCT关键字,它的主要作用就是对数据表中一个或多个字段重复的数据进行过滤,只返回其中的一条数据... 目录DISTINCT 六大注意事项1. 作用范围:所有 SELECT 字段2. NULL 值的特殊处

SQL BETWEEN 语句的基本用法详解

《SQLBETWEEN语句的基本用法详解》SQLBETWEEN语句是一个用于在SQL查询中指定查询条件的重要工具,它允许用户指定一个范围,用于筛选符合特定条件的记录,本文将详细介绍BETWEEN语... 目录概述BETWEEN 语句的基本用法BETWEEN 语句的示例示例 1:查询年龄在 20 到 30 岁

Python中图片与PDF识别文本(OCR)的全面指南

《Python中图片与PDF识别文本(OCR)的全面指南》在数据爆炸时代,80%的企业数据以非结构化形式存在,其中PDF和图像是最主要的载体,本文将深入探索Python中OCR技术如何将这些数字纸张转... 目录一、OCR技术核心原理二、python图像识别四大工具库1. Pytesseract - 经典O

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

CSS place-items: center解析与用法详解

《CSSplace-items:center解析与用法详解》place-items:center;是一个强大的CSS简写属性,用于同时控制网格(Grid)和弹性盒(Flexbox)... place-items: center; 是一个强大的 css 简写属性,用于同时控制 网格(Grid) 和 弹性盒(F

CSS Anchor Positioning重新定义锚点定位的时代来临(最新推荐)

《CSSAnchorPositioning重新定义锚点定位的时代来临(最新推荐)》CSSAnchorPositioning是一项仍在草案中的新特性,由Chrome125开始提供原生支持需... 目录 css Anchor Positioning:重新定义「锚定定位」的时代来了! 什么是 Anchor Pos

HTML5 getUserMedia API网页录音实现指南示例小结

《HTML5getUserMediaAPI网页录音实现指南示例小结》本教程将指导你如何利用这一API,结合WebAudioAPI,实现网页录音功能,从获取音频流到处理和保存录音,整个过程将逐步... 目录1. html5 getUserMedia API简介1.1 API概念与历史1.2 功能与优势1.3

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4