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 简介的主要内容,如果未能解决你的问题,请参考以下文章

XML Schema简介

在当前范围内没有为 struct `schema::users::columns::roles` 找到名为 `contains` 的方法

在当前范围内没有为 struct `schema::todos::table` 找到名为 `table` 的函数或关联项

xml约束技术---schema

Mobile phones(二维树状数组) POJ - 1195

LeetCode﹝前缀和ி﹞一维二维前缀和应用