跳转到内容

XML - 数据交换管理/数据模式

来自维基教科书,开放世界中的开放书籍



上一章 下一章
递归关系 DTD




学习目标

  • 数据模式概述
  • 正确地开始您的模式
  • 一般实体
  • 父子结构
  • 属性和限制
  • 正确地结束您的模式

发起者

佐治亚大学

特里商学院

管理信息系统系


数据模式是所有 XML 页面的基础。它们定义了对象、它们的关系、它们的属性以及数据模型的结构。没有它们,XML 文档将不存在。在本章中,您将了解 XML 数据模式的目的、它们错综复杂的部分以及如何使用它们。此外,还将包含示例供您在创建自己的数据模式时复制,从而使您的工作变得更加轻松。在本网页的底部,包含了一个完整的模式,其中部分内容包含在本章的各个部分中。如果您想了解整个模式是如何作为一个整体工作的,请参考它。

数据模式概述

[编辑 | 编辑源代码]

数据模式,抛开所有技术细节,就是传递所有 XML 信息的数据模型。它具有层次结构,从根元素(稍后将解释)开始,一直延伸到覆盖模型的每一个细节,并在中间包含详细的步骤。数据模式主要包含两个部分:实体及其关系。数据模式中包含的实体代表模型中的对象。它们具有唯一的标识符、属性和表示它们是什么类型的对象的名称。模式中的关系代表对象之间的关系,非常简单。关系可以是一对一、一对多、多对多、递归以及您可以在数据模型中找到的任何其他类型。现在我们将开始创建自己的数据模式。

正确地开始您的模式

[编辑 | 编辑源代码]

所有模式的开始方式都一样,无论它们代表什么类型的对象。每个模式的第一行都是此声明

<?xml version="1.0" encoding="UTF-8"?>

示例 1:XML 声明

示例 1 只是告诉浏览器或访问此模式的任何文件/程序,它是一个 XML 文件并使用编码结构“UTF-8”。您可以复制此代码来开始您自己的 XML 文件。接下来是命名空间声明

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified">

示例 2:命名空间声明

命名空间基本上是包含模式中大部分编码的定义的字典。例如,在创建模式时,如果您声明一个对象为“String”类型,那么“String”类型的定义将包含在命名空间中,以及它的所有属性。对于您编写的几乎所有代码,情况都是如此。如果您创建或看过其他模式,大部分代码前面都是“xsd:”。一个很好的例子是“xsd:sequence”或“xsd:complexType”。sequence 和 complexType 都是定义在命名空间中的对象,该命名空间已链接到前缀“xsd”。事实上,理论上您可以将默认命名空间命名为任何名称,只要您在整个模式中以相同的方式引用它即可。最常见的命名空间包含大多数 XML 对象,是http://www.w3.org/2001/XMLSchema。现在来看示例 2。

第一部分让任何文件/程序都知道这是一个模式。很容易理解。就像 XML 声明一样,这是 XML 模式通用的,您可以将其用于您自己的模式。第二部分是实际的命名空间声明;xmlns 代表 XML NameSpace。这定义了模式的默认命名空间,通常是代码中给出的命名空间。同样,我建议使用此代码来开始您的模式。最后一部分很难理解,但这里有一个非常详细的解释。使用“unqualified”最适用,直到您遇到一些非常复杂的代码。

一般实体

[编辑 | 编辑源代码]

实体基本上是创建模式来表示的对象。如前所述,它们具有属性和关系。我们现在将更深入地解释它们到底是什么以及如何为它们编写代码。

实体有两种类型:simpleTypecomplexType。simpleType 对象只有一个与其关联的值。字符串就是一个完美的 simpleType 对象示例,因为它只包含字符串的值。大多数使用的 simpleType 将在默认命名空间中定义;但是,您可以在模式的底部定义自己的 simpleType(这将在限制部分提到)。因此,您在模式中最常需要包含的对象只是 complexType。complexType 是一个具有多个与之关联的属性的对象,它可能包含也可能不包含与其关联的子元素。这是一个 complexType 对象的示例

<xsd:complexType name="GenreType">
  <xsd:sequence>
    <xsd:element name="name" type="xsd:string"/>
    <xsd:element name="description" type="xsd:string"/>
    <xsd:element name="movie" type="MovieType" minOccurs="1" maxOccurs="unbounded"/>
  </xsd:sequence>
</xsd:complexType>

示例 3:complexType 元素

此代码从 complexType 的声明及其名称开始。当其他实体引用它时,例如父元素,它将引用此名称。第 2 行开始属性和子元素的序列,它们都声明为“element”。元素声明为元素,代码行的第一部分,它们的名称(其他文档将引用)包含在第二部分的“name”中。在第一个和第二个声明之后是“type”声明。请注意,对于namedescription 元素,它们的类型是“xsd:string”,表明字符串类型在“xsd”命名空间中定义。对于movie 元素,类型是“MovieType”,因为“MovieType”前面没有命名空间,所以假设此类型包含在此模式中。(如果另一个模式包含在模式的顶部,它可能引用另一个模式中定义的类型。现在不用担心)“minOccurs”和“maxOccurs”表示 Genre 和 MovieType 之间的关系。“minOccurs”可以是 0 或任意数字,仅取决于数据模型。“maxOccurs”可以是 1(一对一关系)、任意数字(一对多关系)或“unbounded”(一对多关系)。

每个模式都必须有一个根元素。此实体包含层次结构中其下方的所有其他实体。例如,在创建包含电影列表的模式时,根元素将类似于 MovieDatabase,或者可能是 MovieCollection,只是某种逻辑上包含所有其他对象(如类型、电影、演员、导演、剧情等)的东西。它总是从以下代码行开始:<xsd:element name="xxx">表示它是根元素,然后作为正常的 complexType 继续。所有其他对象将以 simpleType 或 complexType 开头。以下是一个 MovieDatabase 根元素的示例代码

<xsd:element name="MovieDatabase">
     <xsd:complexType>
       <xsd:sequence>
         <xsd:element name="Genre" type="GenreType" minOccurs="1" maxOccurs="unbounded"/>            
       </xsd:sequence>
     </xsd:complexType>
   </xsd:element>

示例 4:根元素

这代表一个 MovieDatabase,其中 MovieDatabase 的子元素是 Genre。从那里它继续到电影等。我们将继续使用这个例子来帮助你更好地理解。

父子关系

[编辑 | 编辑源代码]

父子关系是数据模式中的一个关键主题。它通过明确地阐述自上而下的配置,来表示数据模型层次结构的基本结构。看看这段代码,它显示了电影如何与演员相关联

<xsd:complexType name="MovieType">
  <xsd:sequence>
    <xsd:element name="name" type="xsd:string"/>       
    <xsd:element name="actor" type="ActorType" minOccurs="1" maxOccurs="unbounded"/>
  </xsd:sequence>
</xsd:complexType>
     
<xsd:complexType name="ActorType">
  <xsd:sequence>
    <xsd:element name="lname" type="xsd:string"/>
    <xsd:element name="fname" type="xsd:string"/>
  </xsd:sequence>
</xsd:complexType>

示例 5:父子关系

在每个 MovieType 中,都有一个名为“actor”的元素,它是“ActorType”类型的。当 XML 文档填充信息时,actor 周围的标签将是<actor></actor>,而不是<ActorType></ActorType>。为了使你的模式流畅且无错误,父元素中的type字段将始终等于complexType 子元素声明中的name字段。

属性和限制

[编辑 | 编辑源代码]

实体的属性是 simpleType 对象,因为它只包含一个值。<xsd:element name="lname" type="xsd:string"/>是属性的一个很好的例子。它被声明为一个元素,与之相关联一个名称,并有一个类型声明。本章附录中包含了默认命名空间中内置的众多 simpleType 列表。属性的使用非常简单,直到你尝试对其进行限制。

在某些情况下,某些数据必须遵守标准才能维护数据完整性。一个例子是社会安全号码或电子邮件地址。如果你有一个包含发送大量电子邮件的电子邮件地址的数据库,则需要所有电子邮件地址都是有效的地址,否则每次发送电子邮件时都会收到大量错误消息。为了避免这个问题,你可以实质上获取已知的 simpleType 并添加一个限制,以更好地满足你的需求。现在你可以通过两种方式做到这一点,但其中一种更简单,更适合在数据模式中使用。你可以在父元素的声明中编辑 simpleType,但这会很混乱,如果另一个模式想要使用它,则必须重新编写代码。更好的方法是在模式底部列出一种新的类型,它会编辑之前已知的 simpleType。以下是一个使用社会安全号码的示例

<xsd:simpleType name="emailaddressType">
  <xsd:restriction base="xsd:string">
    <xsd:pattern value="[^@]+@[^\.]+\..+"/>
  </xsd:restriction>
</xsd:simpleType>
   
<xsd:simpleType name="ssnType">
  <xsd:restriction base="xsd:string">
    <xsd:pattern value="\d{3}-\d{2}-\d{4}"/>
  </xsd:restriction>
</xsd:simpleType>

示例 6:simpleType 上的限制

它包含在最后一个子元素下面的模式中,并在结束的</xsd:schema>之前。第一行声明了 simpleType 并为其命名为“ssnType”。你可以随意命名,只要你在整个模式中正确引用它即可。通过这样做,你可以在模式中的任何位置或另一个模式中的任何位置使用此类型,前提是引用正确。第二行让模式知道它是一个受限类型,并且它的基类是默认命名空间中定义的字符串。基本上,这种类型是一个字符串,对它进行了限制,第三行是实际的限制。它可以是许多类型限制中的一种,它们列在本章附录中。这种情况碰巧是“pattern”类型。“pattern”意味着 XML 文档中只允许使用特定顺序的字符,它在value字段中定义。此特定值表示三个数字,一个连字符,两个数字,一个连字符,以及四个数字。要了解更多关于如何使用限制的信息,请访问 此链接,了解 W3 学校关于限制的部分。

并非无关紧要:介绍<xsd:import>标签

[编辑 | 编辑源代码]

<xsd:import>标签用于导入模式文档以及与模式文档中定义的数据类型相关的命名空间。这允许 XML 模式文档使用命名空间名称(前缀)来引用类型库。让我们仔细看看商店的简单 XML 实例文档,该文档使用这些多个命名空间名称

<?xml version="1.0" encoding="UTF-8"?>
<store:SimpleStore xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.opentourism.org/xmltext/SimpleStore.xsd"
  xmlns:store="http://www.opentourism.org/xmltext/Store"
  xmlns:MGR="http://www.opentourism.org/xmltext/CoreSchema">
  <!-- Note the explicitly defined namespace declarations, the prefix store 
     represents data types defined in the     
     <code>http://www.opentourism.org/xmltext/Store.xml</code> namespace and the 
     prefix MGR represents data types defined in the 
     <code>http://www.opentourism.org/xmltext/CoreSchema</code> namespace. 
     Also, notice that there is no default namespace declaration – every element
     and attribute must be associated with a namespace (we will see this is 
     necessary weh we examine the schema document)  
-->
  <store:Store>
    <MGR:Name xmlns:MGR=" http://www.opentourism.org/xmltext/CoreSchema ">
      <MGR:FirstName>Michael</MGR:FirstName>
      <MGR:MiddleNames>Jay</MGR:MiddleNames>
      <MGR:LastName>Fox</MGR:LastName>
    </MGR:Name>
    <store:StoreName>The Gap</store:StoreName>
    <store:StoreAddress>
      <store:Street>86 Nowhere Ave.</store:Street>
      <store:City>Los Angeles</store:City>
      <store:State>CA</store:State>
      <store:ZipCode>75309</store:ZipCode>
    </store:StoreAddress>
    <!-- More store information would go here. -->
  </store:Store>
  <!-- More stores would go here. -->
</store:SimpleStore>

示例 7 XML 实例文档 – [1]


让我们看看模式文档,并了解如何使用<xsd:import>标签从类型库(外部模式文档)中导入数据类型。

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns="http://www.opentourism.org/xmltext/Store.xml"
  xmlns:MGR="http://www.opentourism.org/xmltext/CoreSchema"
  targetNamespace="http://www.opentourism.org/xmltext/Store.xml" elementFormDefault="qualified">
  <!-- The prefix MGR is bound to the following namespace name: 
          <code>http://www.opentourism.org/xmltext/CoreSchema</code>
          The managerTypeLib.xsd schema document is imported by associating the 
          schema with the <code>http://www.opentourism.org/xmltext/CoreSchema</code> 
          namespace name, which was bound to the MGR prefix. 
          The elementFormDefault attribute has the value ‘qualified' indicating that 
          an XML instance document must use qualified names for every element(default
          namespace can not be used)  
-->
  <!-- The target namespace and default namespace are the same  -->
  <xsd:import namespace="http://www.opentourism.org/xmltext/CoreSchema"
    schemaLocation="ManagerTypeLib.xsd"/>
  <xsd:element name="SimpleStore">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Store" type="StoreType" maxOccurs="unbounded"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:complexType name="StoreType">
    <xsd:sequence>
      <xsd:element ref="MGR:Name"/>
      <xsd:element name="StoreName" type="xsd:string"/>
      <xsd:element name="StoreAddress" type="StoreAddressType"/>
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="StoreAddressType">
    <xsd:sequence>
      <xsd:element name="Street" type="xsd:string"/>
      <xsd:element name="City" type="xsd:string"/>
      <xsd:element name="State" type="xsd:string"/>
      <xsd:element name="ZipCode" type="xsd:string"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>

示例 8:XML 模式 [http://www.opentourism.org/xmltext/SimpleStore.xsd


与 include 标签和 redefine 标签一样,import 标签是将外部模式文档中的任何数据类型合并到另一个模式文档中的另一种方法,并且必须在任何元素或属性声明之前出现。当 XML 模式模块化并且类型库在多个模式文档中维护和使用时,这些机制非常重要。

当整体大于部分之和时
模式模块化

[编辑 | 编辑源代码]

现在我们已经介绍了合并外部 XML 模式的所有三种方法,让我们考虑这些机制的重要性。与大多数编程代码一样,冗余不受欢迎;对于自定义数据类型定义也是如此。如果已经存在可以应用于模式文档中元素的自定义数据类型,那么在新的模式文档中再次创建它而不是使用它是否有意义?此外,如果你知道单个数据类型可以重复用于多个应用程序,那么当你需要它时,你是否应该有一种引用该数据类型的方法?

模块化模式背后的理念是检查你的模式做了什么,确定哪些数据类型以某种形式频繁使用,并开发一个类型库。随着你对更复杂模式的需求增加,你可以继续添加你的库,重复使用你的类型库中的数据类型,并在需要时重新定义这些数据类型。这种重复使用的一个例子是客户信息模式——不同的部门将使用不同的模式,因为他们只需要部分客户信息。但是,大多数部门(如果不是所有部门的话)都需要一些特定的客户信息,例如姓名和联系信息,这些信息可以包含在各个部门模式文档中。

模式模块化是一种“最佳实践”。通过维护类型库以及重复使用和重新定义类型库中的类型,你可以帮助确保你的 XML 模式文档不会变得过于庞大而难以阅读。可读性很重要,因为你可能不是唯一使用这些模式的人,重要的是其他人可以轻松地理解你的模式文档。

“选择,但要明智地选择……”:模式替代方案

[编辑 | 编辑源代码]

到目前为止,我们只讨论了由万维网联盟 (W3C) 定义的 XML 模式。然而,还有其他方法可以定义 XML 实例文档中包含的数据,但我们只提到了两种最流行和最知名的替代方法:文档类型定义 (DTD) 和 Relax NG 模式。

我们将在下一章介绍 DTD。Relax NG 模式更新,并且具有与 W3C XML 模式相同的许多功能;Relax NG 还声称更简单、更容易学习,但这非常主观。有关 Relax NG 的更多信息,请访问:http://www.relaxng.org/

首先是本章示例中使用的完整模式。

<?xml version="1.0" encoding="UTF-8"?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
elementFormDefault="unqualified">
    
   <xsd:element name="MovieDatabase">
     <xsd:complexType>
       <xsd:sequence>
         <xsd:element name="Genre" type="GenreType" minOccurs="1" maxOccurs="unbounded"/>            
       </xsd:sequence>
     </xsd:complexType>
   </xsd:element>
         
     <xsd:complexType name="GenreType">
       <xsd:sequence>
         <xsd:element name="name" type="xsd:string"/>
         <xsd:element name="description" type="xsd:string"/>
         <xsd:element name="movie" type="MovieType" minOccurs="1" maxOccurs="unbounded"/>
       </xsd:sequence>
     </xsd:complexType>
     
     <xsd:complexType name="MovieType">
       <xsd:sequence>
         <xsd:element name="name" type="xsd:string"/>
         <xsd:element name="rating" type="xsd:string"/>
         <xsd:element name="director" type="xsd:string"/>
         <xsd:element name="writer" type="xsd:string"/>
         <xsd:element name="year" type="xsd:int"/>
         <xsd:element name="tagline" type="xsd:string"/>       
         <xsd:element name="actor" type="ActorType" minOccurs="1" maxOccurs="unbounded"/>
       </xsd:sequence>
     </xsd:complexType>
     
     <xsd:complexType name="ActorType">
       <xsd:sequence>
         <xsd:element name="lname" type="xsd:string"/>
         <xsd:element name="fname" type="xsd:string"/>
         <xsd:element name="gender" type="xsd:string"/>
         <xsd:element name="bday" type="xsd:string"/>
         <xsd:element name="birthplace" type="xsd:string"/>
         <xsd:element name="ssn" type="ssnType"/>
       </xsd:sequence>
     </xsd:complexType>
     
     <xsd:simpleType name="ssnType">
       <xsd:restriction base="xsd:string">
         <xsd:pattern value="\d{3}-\d{2}-\d{4}"/>
       </xsd:restriction>
   </xsd:simpleType>
   
</xsd:schema>

现在是时候回到起点……并回顾一下我们迄今为止涵盖的所有模式数据类型、元素和属性(以及我们可能没有涵盖的几个属性)。下表将详细说明可以在 XML 模式中使用的 XML 数据类型、元素和属性。

基本类型

这是一个包含所有基本类型的表格,您的模式中的属性可以是这些类型。

类型 语法 合法值示例 约束面
xsd:anyURI <xsd:element name = “url” type = “xsd:anyURI” /> http://www.w3.com length, minLength, maxLength, pattern, enumeration, whitespace
xsd:boolean <xsd:element name = “hasChildren” type = “xsd:boolean” /> true false 1 0 pattern 和 whitespace
xsd:byte <xsd:element name = “stdDev” type = “xsd:byte” /> -128 127 length, minInclusive, maxInclusive, minExclusive, maxExclusive, pattern, enumeration, whitespace 和 totalDigits
xsd:date <xsd:element name = “dateEst” type = “xsd:date” /> 2004-03-15 minInclusive, maxInclusive, minExclusive, maxExclusive, pattern, enumeration 和 whitespace
xsd:dateTime <xsd:element name = “xMas” type = “xsd:dateTime” /> 2003-12-25T08:30:00 minInclusive, maxInclusive, minExclusive, maxExclusive, pattern, enumeration 和 whitespace
xsd:decimal <xsd:element name = “pi” type = “xsd:decimal” /> 3.1415292 minInclusive, maxInclusive, minExclusive, maxExclusive, pattern, enumeration,   whitespace, fractionDigits 和 totalDigits
xsd:double <xsd:element name = “pi” type = “xsd:double” /> 3.1415292 INF NaN minInclusive, maxInclusive, minExclusive, maxExclusive, pattern, enumeration,   和 whitespace
xsd:duration <xsd:element name = “MITDuration” type = “xsd:duration” /> P8M3DT7H33M2S
xsd:float <xsd:element name = “pi” type = “xsd:float” /> 3.1415292 INF NaN minInclusive, maxInclusive, minExclusive, maxExclusive, pattern, enumeration,   和 whitespace
xsd:gDay <xsd:element name = “dayOfMonth” type = “xsd:gDay” /> ---11 minInclusive, maxInclusive, minExclusive, maxExclusive, pattern, enumeration,   和 whitespace
xsd:gMonth <xsd:element name = “monthOfYear” type = “xsd:gMonth” /> --02-- minInclusive, maxInclusive, minExclusive, maxExclusive, pattern, enumeration,   和 whitespace
xsd:gMonthDay <xsd:element name = “valentine” type = “xsd:gMonthDay” /> --02-14 minInclusive, maxInclusive, minExclusive, maxExclusive, pattern, enumeration,   和 whitespace
xsd:gYear <xsd:element name = “year” type = “xsd:gYear” /> 1999 minInclusive, maxInclusive, minExclusive, maxExclusive, pattern, enumeration,   和 whitespace
xsd:gYearMonth <xsd:element name = “birthday” type = “xsd:gYearMonth” /> 1972-08 minInclusive, maxInclusive, minExclusive, maxExclusive, pattern, enumeration,   和 whitespace
xsd:ID <xsd:attribute name="id" type="xsd:ID"/> id-102 length, minLength, maxLength, pattern, enumeration,   和 whitespace
xsd:IDREF <xsd:attribute name="version" type="xsd:IDREF"/> id-102 length, minLength, maxLength, pattern, enumeration,   和 whitespace
xsd:IDREFS <xsd:attribute name="versionList" type="xsd:IDREFS"/> id-102 id-103 id-100 length, minLength, maxLength, pattern, enumeration,   和 whitespace
xsd:int <xsd:element name = “age” type = “xsd:int” /> 77 minInclusive, maxInclusive, minExclusive, maxExclusive, pattern, enumeration, whitespace 和 totalDigits
xsd:integer <xsd:element name = “age” type = “xsd:integer” /> 77 minInclusive, maxInclusive, minExclusive, maxExclusive, pattern, enumeration,   和 whitespace
xsd:long <xsd:element name = “cannelNumber” type = “xsd:int” /> 214 minInclusive, maxInclusive, minExclusive, maxExclusive, pattern, enumeration,   和 whitespace
xsd:negativeInteger <xsd:element name = “belowZero” type = “xsd:negativeInteger” /> -123 minInclusive, maxInclusive, minExclusive, maxExclusive, pattern, enumeration,   whitespace 和 totalDigits
xsd:nonNegativeInteger <xsd:element name = “numOfchildren” type = “xsd:nonNegativeInteger” /> 2 minInclusive, maxInclusive, minExclusive, maxExclusive, pattern, enumeration,   whitespace 和 totalDigits
xsd:nonPositiveInteger <xsd:element name = “debit” type = “xsd:nonPositiveInteger” /> 0 minInclusive, maxInclusive, minExclusive, maxExclusive, pattern, enumeration,   whitespace 和 totalDigits
xsd:positiveInteger <xsd:element name = “credit” type = “xsd:positiveInteger” /> 500 minInclusive, maxInclusive, minExclusive, maxExclusive, pattern, enumeration,   whitespace 和 totalDigits
xsd:short <xsd:element name = “numOfpages” type = “xsd:short” /> 476 minInclusive, maxInclusive, minExclusive, maxExclusive, pattern, enumeration,   whitespace 和 totalDigits
xsd:string <xsd:element name = “name” type = “xsd:string” /> Joeseph length, minLength, maxLength, pattern, enumeration,   whitespace 和 totalDigits
xsd:time <xsd:element name = “credit” type = “xsd:time” /> 13:02:00 minInclusive, maxInclusive, minExclusive, maxExclusive, pattern, enumeration,   和 whitespace,

模式元素
( 来自 https://w3schools.org.cn/schema/schema_elements_ref.asp )

以下列出了所有可以包含在您的模式中的元素。

元素 解释
all 指定子元素可以按任何顺序出现。每个子元素都可以出现 0 或 1 次
annotation 指定模式注释的顶层元素
any 使作者能够使用模式未指定的元素扩展 XML 文档
anyAttribute 使作者能够使用模式未指定的属性扩展 XML 文档
appInfo 指定要由应用程序使用的信息(必须位于注释内部)
attribute 定义一个属性
attributeGroup 定义一个属性组,用于复杂类型定义
choice 仅允许在包含元素内存在 <choice> 声明中包含的元素之一
complexContent 定义对包含混合内容或仅包含元素的复杂类型的扩展或限制
complexType 定义一个复杂类型元素
documentation 定义模式中的文本注释(必须位于注释内部)
element 定义一个元素
extension 扩展现有的 simpleType 或 complexType 元素
field 指定用于定义标识约束的值的 XPath 表达式
group 定义一组元素,用于复杂类型定义
import 将具有不同目标命名空间的多个模式添加到文档
include 将具有相同目标命名空间的多个模式添加到文档
key 指定属性或元素值作为实例文档中包含元素内的键(唯一、不可为空且始终存在)
keyref 指定属性或元素值与指定键或唯一元素的那些值对应
list 将简单类型元素定义为值的列表
notation 描述 XML 文档中非 XML 数据的格式
redefine 从外部模式重新定义简单类型和复杂类型、组和属性组
restriction 定义对 simpleType、simpleContent 或 complexContent 的限制
schema 定义模式的根元素
selector 指定选择一组元素以进行标识约束的 XPath 表达式
sequence 指定子元素必须按顺序出现。每个子元素可以出现 0 到任意多次
simpleContent 包含对纯文本复杂类型或简单类型的扩展或限制作为内容,并且不包含任何元素
simpleType 定义一个简单类型,并指定关于属性或纯文本元素的值的约束和信息
union 将简单类型定义为从指定简单数据类型收集(联合)的值
unique 定义元素或属性值在范围内必须是唯一的

模式数据类型限制和面
( 来自 https://w3schools.org.cn/schema/schema_elements_ref.asp )

以下列出了所有可以包含在您的模式中的限制类型。

约束 描述
enumeration 定义一个可接受值的列表
fractionDigits 指定允许的小数位数的最大值。必须等于或大于零
length 指定允许的字符或列表项的精确数量。必须等于或大于零
maxExclusive 指定数值的上限(值必须小于该值)
maxInclusive 指定数值的上限(值必须小于或等于该值)
maxLength 指定允许的字符或列表项的最大数量。必须等于或大于零
minExclusive 指定数值的下限(值必须大于该值)
minInclusive 指定数值的下限(值必须大于或等于该值)
minLength 指定允许的字符或列表项的最小数量。必须等于或大于零
pattern 定义可接受的字符的精确顺序
totalDigits 指定允许的数字的精确数量。必须大于零
whiteSpace 指定如何处理空格(换行符、制表符、空格和回车符)

正则表达式

可以使用特殊的正则表达式(regex)语言构建模式。XML 模式中的正则表达式语言基于 Perl 的正则表达式语言。以下是一些常见的符号

. (句点) 对于任何字符
\d 对于任何数字
\D 对于任何非数字
\w 对于任何单词(字母数字)字符
\W 对于任何非单词字符(例如 -、+、=)
\s 对于任何空格(包括空格、制表符、换行符和回车符)
\S 对于任何不是空格的字符
x* 具有零个或多个 x
(xy)* 具有零个或多个 xy
x+ x 的重复,至少一次
x? 具有一个或零个 x
(xy)? 具有一个或没有 xy
[abc] 包括一组值中的一个
[0-9] 包括从 0 到 9 的值范围
x{5} 具有恰好 5 个 x(连续)
x{5,} 至少有 5 个 x(连续)
x{5,8} 至少 5 个,最多 8 个 x(连续)
(xyz){2} 具有恰好 2 个 xyz(连续)
例如,验证社会保险号码的模式是 \d{3}-\d{2}-\d{4}

emailAddressType 的模式代码是 \w+\W*\w*@{1}\w+\W*\w+.\w+.*\w*

[w+] 至少一个单词(字母数字)字符, 例如 answer
[W*] 后面可以跟零个、一个或多个非单词字符, 例如:
[w*@{1}] 后面可以跟任何(或没有)单词字符和一个@符号, 例如:my@
[w+] 后面至少要有一个单词字符, 例如:mail
[W*] 后面可以跟零个、一个或多个非单词字符, 例如:_
[w+.] 后面至少要有一个单词字符和一个句号, 例如:please.
[w+.*] 后面可以跟零到无限次前面的字符串, 例如:opentourism.
[w*] 最后跟零个、一个或多个单词字符 例如:org
email-address: answer-my@mail_please.opentourism.org

实例文档属性
这些属性不需要在模式中声明

属性 解释 示例
xsi:nil 表示某个元素没有值或值未知。该元素必须在模式文档中设置为 nillable

<xsd:element name=”last_name” type=”xsd:string” nillable=true”/>

<full_name xmlns:xsi= ”http://www.w3.org/2001/XMLSchema-instance”>    <first_name>Madonna</first_name>

<last_name xsi:nil=”true”/> </full_name>

xsi:noNamespaceSchemaLocation 定位不在任何命名空间中的元素的模式 <radio xsi:noNamespaceSchemaLocation= ”http://www.opentourism.org/xmtext/radio.xsd”>

<!—radio stuff goes here -- > </radio>

xsi:schemaLocation 定位位于指定命名空间中的元素和属性的模式 <radio xmlns= ”http://www.opentourism.org/xmtext/NS/radio xmlns:xsi= ”http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation= ”http://www.arches.uga.eduNS/radio”http://www.opentourism.org/xmtext/radio.xsd”>

<!—radio stuff goes here -- > </radio>

xsi:type 可以在实例文档中用于指示元素的类型。 <height xsi:type=”xsd:decimal”>78.9</height>


有关 XML 模式结构、数据类型和工具的更多信息,您可以访问 http://www.w3.org/XML/Schema

华夏公益教科书