XML Schema 简介
Posted 戴泽supp
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XML Schema 简介相关的知识,希望对你有一定的参考价值。
XML Schema 简介
一、什么是 XML Schema?
XML Schema 是基于 XML 的 DTD 替代者。XML Schema 可描述 XML 文档的结构。XML Schema 语言也可作为 XSD(XML Schema Definition)来引用。
XML Schema 的作用是定义 XML 文档的合法构建模块,类似 DTD。
XML Schema 特征
- 定义可出现在文档中的元素
- 定义可出现在文档中的属性
- 定义哪个元素是子元素
- 定义子元素的次序
- 定义子元素的数目
- 定义元素是否为空,或者是否可包含文本
- 定义元素和属性的数据类型
- 定义元素和属性的默认值以及固定值
二、XSD 如何使用
1、一个简单的 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>
使用 DTD note.dtd
- 它对上面那个 XML 文档( “note.xml” )的元素进行了定义
<!ELEMENT note (to, from, heading, body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
使用 XSD note.xsd
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">
<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>
2、对 DTD 的引用
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM
"http://www.w3schools.com/dtd/note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
3、对 XML Schema 的引用
<?xml version="1.0"?>
<note
xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3schools.com note.xsd">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
三、<schema>
元素
<schema>
元素是每一个 XML Schema 的根元素。它可包含属性。一个 schema 声明往往看上去类似这样:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.runoob.com"
xmlns="http://www.runoob.com"
elementFormDefault="qualified">
...
...
</xs:schema>
-
xmlns:xs="http://www.w3.org/2001/XMLSchema"
,显示 schema 中用到的元素和数据类型来自命名空间 “http://www.w3.org/2001/XMLSchema”.同时它还规定了来自命名空间 “http://www.w3.org/2001/XMLSchema” 的元素和数据类型应该使用前缀 xs。 -
targetNamespace="http://www.runoob.com"
显示被此 schema 定义的元素 (note, to, from, heading, body) 来自目标命名空间: “http://www.runoob.com”。 -
xmlns="http://www.runoob.com"
指出默认的命名空间是 “http://www.runoob.com”。 -
elementFormDefault="qualified"
指出任何 XML 实例文档所使用的且在此 schema 中声明过的元素必须被命名空间限定。
1、在 XML 文档中引用 Schema
<?xml version="1.0"?>
<note xmlns="http://www.runoob.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.runoob.com note.xsd">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
-
xmlns="http://www.runoob.com"
规定了默认命名空间的声明。此声明会告知 schema 验证器,在此 XML 文档中使用的所有元素都被声明于 “http://www.runoob.com” 这个命名空间。 -
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
:可用的 XML Schema 实例命名空间,它定义了一个命名空间前缀 xsi 对应的唯一字符串 http://www.w3.org/2001/XMLSchema-instance。 但是读者会发现, 这个 xmlns:xsi 在不同的 xml 文档中似乎都会出现。 这是因为, xsi 已经成为了一个业界默认的用于 XSD((XML Schema Definition) 文件的命名空间。 -
xsi:schemaLocation="http://www.runoob.com note.xsd"
:schemaLocation 属性了。此属性有两个值。第一个值是需要使用的命名空间。第二个值是供命名空间使用的 XML schema 的位置-
上面这行的语法其实是:
xsi:schemaLocation = "键" "值"
即 xsi 命名空间下 schemaLocation 元素的值为一个由空格分开的键值对。
前一个"键" http://maven.apache.org/POM/4.0.0 指代 【命名空间】, 只是一个全局唯一字符串而已。
后一个值指代 【XSD location URI】 , 这个值指示了前一个命名空间所对应的 XSD 文件的位置, xml parser 可以利用这个信息获取到 XSD 文件, 从而通过 XSD 文件对所有属于 命名空间 http://maven.apache.org/POM/4.0.0 的元素结构进行校验, 因此这个值必然是可以访问的, 且访问到的内容是一个 XSD 文件的内容。
-
四、XSD 简易元素
简易元素指那些只包含文本的元素。它不会包含任何其他的元素或属性。文本有很多类型。它可以是 XML Schema 定义中包括的类型中的一种(布尔、字符串、数据等等),或者它也可以是自行定义的定制类型。用户也可以向数据类型添加限定(即 facets),以此来限制它的内容,或者要求数据匹配某种特定的模式。
1、定义简易元素
语法:
<xs:element name="xxx" type="yyy"/>
- xxx 指元素的名称,yyy 指元素的数据类型。XML Schema 拥有很多内建的数据类型。
最常用的类型是:
- xs:string
- xs:decimal
- xs:integer
- xs:boolean
- xs:date
- xs:time
示例
<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"/>
默认值 && 固定值
默认值
<xs:element name="color" type="xs:string" default="red"/>
固定值
<xs:element name="color" type="xs:string" fixed="red"/>
五、XSD 属性
语法:
<xs:attribute name="xxx" type="yyy"/>
对应的属性定义:
<xs:attribute name="lang" type="xs:string"/>
默认值 && 固定值
默认值
<xs:attribute name="lang" type="xs:string" default="EN"/>
固定值
<xs:attribute name="lang" type="xs:string" fixed="EN"/>
可选的 && 必需的
<xs:attribute name="lang" type="xs:string" use="required"/>
对内容的限定
假如 XML 元素的类型是 “xs:date”,而其包含的内容是类似 “Hello World” 的字符串,元素将不会(通过)验证。
通过 XML schema,用户也可向 XML 元素及属性添加自己的限定。这些限定被称为 facet。
六、XSD 限定 / Facets
限定(restriction)用于为 XML 元素或者属性定义可接受的值。对 XML 元素的限定被称为 facet。
对值的限定
- 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>
对一组值的限定
- 定义了带有一个限定的名为 “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” 元素的组成部分。
对一系列值的限定
- 定义了带有一个限定的名为 “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” 的元素。可接受的值是 a - z 中零个或多个字母
<xs:element name="letter">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="([a-z])*"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
对空白字符的限定
- 定义了带有一个限定的名为 “address” 的元素。
- whiteSpace 限定被设置为 “preserve”,这意味着 XML 处理器不会移除任何空白字符。
- whiteSpace 限定被设置为 “replace”,这意味着 XML 处理器将移除所有空白字符(换行、回车、空格以及制表符)
- whiteSpace 限定被设置为 “collapse”,这意味着 XML 处理器将移除所有空白字符(换行、回车、空格以及制表符会被替换为空格,开头和结尾的空格会被移除,而多个连续的空格会被缩减为一个单一的空格)
<xs:element name="address">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="preserve"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
对长度的限定
- 限制元素中值的长度,我们需要使用 length、maxLength 以及 minLength 限定。
- 下面定义了带有一个限定且名为 “password” 的元素。其值必须精确到 8 个字符
<xs:element name="password">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="8"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
数据类型的限定
限定 | 描述 |
---|---|
enumeration | 定义可接受值的一个列表 |
fractionDigits | 定义所允许的最大的小数位数。必须大于等于0。 |
length | 定义所允许的字符或者列表项目的精确数目。必须大于或等于0。 |
maxExclusive | 定义数值的上限。所允许的值必须小于此值。 |
maxInclusive | 定义数值的上限。所允许的值必须小于或等于此值。 |
maxLength | 定义所允许的字符或者列表项目的最大数目。必须大于或等于0。 |
minExclusive | 定义数值的下限。所允许的值必需大于此值。 |
minInclusive | 定义数值的下限。所允许的值必需大于或等于此值。 |
minLength | 定义所允许的字符或者列表项目的最小数目。必须大于或等于0。 |
pattern | 定义可接受的字符的精确序列。 |
totalDigits | 定义所允许的阿拉伯数字的精确位数。必须大于0。 |
whiteSpace | 定义空白字符(换行、回车、空格以及制表符)的处理方式。 |
七、XSD 复合元素
复合元素包含了其他的元素及 /
或属性。
有四种类型的复合元素:
-
空元素:
<product pid="1345"/>
-
包含其他元素的元素
-
<employee> <firstname>John</firstname> <lastname>Smith</lastname> </employee>
-
-
仅包含文本的元素(包含属性):
<food type="dessert">Ice cream</food>
-
包含元素和文本的元素:
<description>It happened on <date lang="norwegian">03.03.99</date>....</description>
注意: 上述元素均可包含属性!
定义复合元素
在 XML Schema 中,我们有两种方式来定义复合元素,请看如下例子
employee 元素
<employee>
<firstname>John</firstname>
<lastname>Smith</lastname>
</employee>
a、 通过命名此元素,可直接对"employee"元素进行声明
- 指示器
<sequence>
表明子元素必须以它们被声明的次序出现
<xs:element name="employee">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
b、“employee” 元素可以使用 type 属性,这个属性的作用是引用要使用的复合类型的名称
<xs:element name="employee" type="personinfo"/>
<xs:complexType name="personinfo">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
如果您使用了上面所描述的方法,那么若干元素均可以使用相同的复合类型,比如这样:
<xs:element name="employee" type="personinfo"/>
<xs:element name="student" type="personinfo"/>
<xs:element name="member" type="personinfo"/>
<xs:complexType name="personinfo">
<xs:sequence>
<xs:element以上是关于XML Schema 简介的主要内容,如果未能解决你的问题,请参考以下文章
在当前范围内没有为 struct `schema::users::columns::roles` 找到名为 `contains` 的方法
在当前范围内没有为 struct `schema::todos::table` 找到名为 `table` 的函数或关联项