跳转到内容

XML 架构

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

欢迎来到XML 架构书籍。它描述了 XML 架构的结构,并解释了如何使用 XML 架构来验证 XML 文档。

TODO
待办事项

编者注
本书被设计为可重复使用的学习对象,必须考虑许多学习环境的限制。在添加资料时请仔细考虑,这些资料可能无法让课程被各种受众重复使用,因此课程应该尽可能保持模块化。这些资料被设计为与实施技术无关,因此课程可以集成到开源学习管理系统中,例如 Moodle。例如,请不要添加依赖于使用 Java 或 Microsoft .Net 的示例。与计算机语言和操作系统相关的特定问题,例如 Java、Microsoft、Mac、GNU/Linux 和 Windows 依赖关系,应该隔离到单独的实验室中,这些实验室可以由讲师根据需要进行最佳包含。

所有示例都应该使用ISO/IEC 11179 三部分大写驼峰式命名法(ObjectPropertyTerm)。这旨在与ebXMLNIEM 标准保持一致。有关更多信息,请参见数据元素名称表示术语

先决条件

[编辑 | 编辑源代码]

阅读本书的学生应该已经熟悉XML 的基本原理,并对数据类型 有一定的了解。

课程指南

[编辑 | 编辑源代码]

只有前缀根元素:<xs:schema>元素 部分是构建 XML 架构所必需的。可以跳过XML 架构的历史XML 架构用于什么?当 XML 架构在验证复杂规则方面变得效率低下时XML 架构示例,后面的部分是从最重要的部分开始的附加信息。

XML 架构的历史

[编辑 | 编辑源代码]

XML 架构 是由万维网联盟 (W3C) 创建的标准http://www.w3c.org。与 DTD 不同,XML 架构使用 XML 文件格式来定义 XML 架构本身。一旦你学习了 XML 文件的结构,你就不需要学习另一种语法。

XML 架构用于什么?

[编辑 | 编辑源代码]

XML 架构主要用于验证 XML 文档的结构和数据类型。就结构而言,XML 架构定义了

  1. 预期哪些数据元素
  2. 预期数据元素的顺序
  3. 这些数据元素的嵌套情况
  4. 哪些数据元素是可选的,哪些数据元素是必需的

XML 架构还可以被 XML 数据映射工具用于快速从数据库中提取数据并将其转移到 XML 文件中。

最好的类比之一是蓝图类比。就像建筑蓝图描述房屋的结构设计一样,XML 架构提供了文件的“结构设计”。

当 XML 架构在验证复杂规则方面变得效率低下时

[编辑 | 编辑源代码]

尽管 XML 架构非常擅长对数据元素和数据类型进行顺序验证,但它们在表达高度复杂的业务规则方面往往很笨拙。例如,当你到达一个大型文件的末尾时,很难制定一条规则来检查一个数据元素是否具有另一个数据元素在文件开头应该具有的另一个值。这可以通过使用 XML 转换和 XPath 表达式来实现。

XML 架构示例

[编辑 | 编辑源代码]

以下是一个完整的 XML 架构文件的示例,用于个人联系人。

XML 架构文件 符合要求的 XML 实例文件示例
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://www.example.org/contactExample"
  xmlns:tns="http://www.example.org/contactExample"
  elementFormDefault="qualified">

  <xs:element name="Contacts">
    <xs:annotation>
      <xs:documentation>
        File of personal contacts.
      </xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence maxOccurs="unbounded">
        <xs:element name="Person">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="PersonGivenName" />
              <xs:element name="PersonFamilyName" />
              <xs:element name="PersonBirthDate" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<ex:Contacts xmlns:ex="http://www.example.org/contactExample"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.example.org/contactExample contactExample.xsd ">
  <ex:Person>
    <ex:PersonGivenName/>
    <ex:PersonFamilyName/>
    <ex:PersonBirthDate/>
  </ex:Person>
</ex:Contacts>

XML 架构文档的结构

[编辑 | 编辑源代码]

与任何其他 XML 文件一样,XML 架构文件通常以 XML 声明 (<?xml version="1.0"?>) 开头,后面是根元素 (始终是 xs:schema)。

尽管可以使用任何前缀来引用命名空间http://www.w3.org/2001/XMLSchema,但最常见的约定是使用“xs”。有些人更喜欢“xsd”;有些人更喜欢使用默认命名空间(这意味着不需要使用前缀)。所有 XML 架构元素都在此命名空间中。

根元素:<xs:schema>

[编辑 | 编辑源代码]

所有 XML 架构文件都必须以 <xs:schema> 标记开始和结束。

XML 架构文件 符合要求的 XML 文件示例
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://www.example.org/contactExample"
  xmlns:tns="http://www.example.org/contactExample"
  elementFormDefault="qualified">
    ...other structure here...
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
    ...any elements here...

架构必须以</xs:schema>结束标记结尾。

XML 架构定义了在命名空间(例如 http://www.example.org/contactExample)中可用的元素和属性。在 XML 架构中,此命名空间使用targetNamespace属性定义。

在 XML 文件中,可以使用xmlns属性导入命名空间(xmlns代表XML NameSpace)。xmlns属性名称可以以:和前缀(例如xs)结尾。在这种情况下,导入的标签必须使用此前缀。前缀用于区分来自不同命名空间的相同名称的标签。

您可以看到,我们在示例中定义的目标命名空间是 XML 文件中导入的命名空间之一。您可以看到,我们使用tns前缀导入文档本身的命名空间,以便我们在文档中定义的元素可以从tns:开始在文档本身中使用。

<xs:sequence>用于元素的有序组。对于无序的元素组,请使用<xs:all>。

元素在 XML 架构中使用<xs:element>标记定义

XML 架构文件 符合要求的 XML 文件示例
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.org/contactExample"
    xmlns:tns="http://www.example.org/contactExample"
    elementFormDefault="qualified">
  <xs:element name="Contacts"/>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<ex:Contacts xmlns:ex="http://www.example.org/contactExample"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.example.org/contactExample contactExample.xsd "/>

具有文本主体的元素

[编辑 | 编辑源代码]

对于具有文本主体的元素,可以使用type属性定义文本的类型

XML 架构文件 符合要求的 XML 文件示例
...
   <xs:element name="PersonGivenName" type="xs:string"/>
...
...
   <ex:PersonGivenName>Sue</ex:PersonGivenName>
...
...
   <xs:element name="PersonFamilyName" type="xs:string"/>
...
...
   <ex:PersonFamilyName>Smith</ex:PersonFamilyName>
...
...
   <xs:element name="PersonBirthDate" type="xs:date"/>
...
...
   <ex:PersonBirthDate>1990-09-23</ex:PersonBirthDate>
...

以下是常见的 XML 架构基本数据类型

类型 描述 用法 合法值示例
xs:anyURI <xs:element name = “url” type = “xs:anyURI” /> http://www.w3.com
xs:boolean <xs:element name = “hasChildren” type = “xs:boolean” /> true false 1 0
xs:byte <xs:element name = “stdDev” type = “xs:byte” /> -128 127
xs:date <xs:element name = “dateEst” type = “xs:date” /> 2004-03-15
xs:dateTime <xs:element name = “xMas” type = “xs:dateTime” /> 2003-12-25T08:30:00
xs:decimal <xs:element name = “pi” type = “xs:decimal” /> 3.1415292
xs:double <xs:element name = “pi” type = “xs:double” /> 3.1415292 INF NaN
xs:duration <xs:element name = “MITDuration” type = “xs:duration” /> P8M3DT7H33M2S
xs:float <xs:element name = “pi” type = “xs:float” /> 3.1415292 INF NaN
xs:gDay <xs:element name = “dayOfMonth” type = “xs:gDay” /> ---11
xs:gMonth <xs:element name = “monthOfYear” type = “xs:gMonth” /> --02(格式 --02-- 通常被列出,但这是错误的)
xs:gMonthDay <xs:element name = “valentine” type = “xs:gMonthDay” /> --02-14
xs:gYear <xs:element name = “year” type = “xs:gYear” /> 1999
xs:gYearMonth <xs:element name = “birthday” type = “xs:gYearMonth” /> 1972-08
xs:ID <xs:attribute name="id" type="xs:ID"/> id-102
xs:IDREF <xs:attribute name="version" type="xs:IDREF"/> id-102
xs:IDREFS <xs:attribute name="versionList" type="xs:IDREFS"/> id-102 id-103 id-100
xs:int <xs:element name = “age” type = “xs:int” /> 77
xs:integer <xs:element name = “age” type = “xs:integer” /> 77
xs:long <xs:element name = “cannelNumber” type = “xs:long” /> 214
xs:negativeInteger <xs:element name = “belowZero” type = “xs:negativeInteger” /> -123
xs:nonNegativeInteger <xs:element name = “numOfchildren” type = “xs:nonNegativeInteger” /> 2
xs:nonPositiveInteger <xs:element name = “debit” type = “xs:nonPositiveInteger” /> 0
xs:positiveInteger <xs:element name = “credit” type = “xs:positiveInteger” /> 500
xs:short <xs:element name = “numOfpages” type = “xs:short” /> 476
xs:string <xs:element name = “name” type = “xs:string” /> Joseph
xs:time <xs:element name = “credit” type = “xs:time” /> 13:02:00

可以使用<xs:simpleType/><xs:restriction/>标记对数据类型定义一些架构限制和方面。例如,可以使用<xs:length/>标记将字符串类型的主体文本固定为 5 个字符的长度,如上所示

XML 架构文件 符合要求的 XML 文件示例
...
  <xs:element name="PersonGivenName">
    <xs:simpleType>
       <xs:restriction base="xs:string">
         <xs:length value="5"/>
       </xs:restriction>
     </xs:simpleType>
   </xs:element>
...
...
  <ex:PersonGivenName>Kevin</ex:PersonGivenName>
...
...
  <ex:PersonGivenName>Helen</ex:PersonGivenName>
...

以下是所有可使用的架构限制和方面

限制 解释 允许的限制值
minExclusive 指定对于任何有序数据类型,比所有允许值都小的值 任何整数、小数、日期或时间
minInclusive 指定对于任何有序数据类型,允许的最小值 任何整数、小数、日期或时间
maxExclusive 指定对于任何有序数据类型,比所有允许值都大的值 任何整数、小数、日期或时间
maxInclusive 指定对于任何有序数据类型,允许的最大值 任何整数、小数、日期或时间
totalDigits 指定允许的小数点左侧和小数点右侧的最大位数 正整数
fractionDigits 指定允许的小数点右侧的最大位数 非负整数
length 指定允许的精确字符数 非负整数
minLength 指定允许的最小字符数 非负整数
maxLength 指定允许的最大字符数 非负整数
enumeration 指定允许的值或允许值集 任何
whiteSpace 如果指定 "preserve" 值,则任何字符都将按原样保留。
如果指定 "replace" 值,则任何制表符 (#x9)、换行符 (#xA) 和回车符 (#xD) 都将替换为空格 (#x20)。
如果指定 "collapse" 值,则任何制表符、换行符和回车符也将替换为空格,
连续空格将合并成单个空格,并且开头和结尾空格将被删除。
"preserve"、"replace" 或 "collapse"
pattern 指定值必须匹配的正则表达式 正则表达式

复杂元素

[编辑 | 编辑源代码]

任何可以具有子元素和/或属性的元素类型都被视为复杂元素。使用<xs:complexType/>标记定义复杂元素类型。

复杂元素的子元素

[编辑 | 编辑源代码]

子元素使用不同的出现规则定义。

子元素可以在<xs:all/>标记中定义:子元素必须全部存在,并且可以按任意顺序出现。

XML 架构文件 符合要求的 XML 文件示例
...
  <xs:element name="Person">
     <xs:complexType>
        <xs:all>
           <xs:element name="PersonGivenName" />
           <xs:element name="PersonFamilyName" />
           <xs:element name="PersonBirthDate" />
        </xs:all>
     </xs:complexType>
  </xs:element>
...
...
  <ex:Person>
    <ex:PersonBirthDate/>
    <ex:PersonFamilyName/>
    <ex:PersonGivenName/>
  </ex:Person>
...

子元素可以在<xs:sequence/>标记中定义:子元素必须按相同的顺序出现。

XML 架构文件 符合要求的 XML 文件示例
...
  <xs:element name="Person">
     <xs:complexType>
        <xs:sequence>
           <xs:element name="PersonGivenName" />
           <xs:element name="PersonFamilyName" />
           <xs:element name="PersonBirthDate" />
        </xs:sequence>
     </xs:complexType>
  </xs:element>
...
...
  <ex:Person>
    <ex:PersonGivenName/>
    <ex:PersonFamilyName/>
    <ex:PersonBirthDate/>
  </ex:Person>
...

子元素可以在<xs:choice/>标记中定义:必须出现一个且只有一个子元素。

XML 架构文件 符合要求的 XML 文件示例
...
  <xs:element name="Person">
     <xs:complexType>
        <xs:choice>
           <xs:element name="PersonGivenName" />
           <xs:element name="PersonFamilyName" />
           <xs:element name="PersonBirthDate" />
        </xs:choice>
     </xs:complexType>
  </xs:element>
...
...
  <ex:Person>
    <ex:PersonGivenName/>
  </ex:Person>
...
...
  <ex:Person>
    <ex:PersonFamilyName/>
  </ex:Person>
...
...
  <ex:Person>
    <ex:PersonBirthDate/>
  </ex:Person>
...

一些出现规则可以包含在其他出现规则中。<xs:choice/>标记和<xs:sequence/>标记可以包含在<xs:choice/>标记或<xs:sequence/>标记中。

XML 架构文件 符合要求的 XML 文件示例
...
  <xs:element name="Person">
     <xs:complexType>
       <xs:sequence>
          <xs:element name="PersonGivenName" />
          <xs:element name="PersonFamilyName" />
          <xs:choice>
            <xs:element name="PersonBirthDate" />
            <xs:element name="PersonAge" />
          </xs:choice>
       </xs:sequence>
     </xs:complexType>
  </xs:element>
...
...
  <ex:Person>
    <ex:PersonGivenName />
    <ex:PersonFamilyName />
    <ex:PersonAge />
  </ex:Person>
...
...
  <ex:Person>
    <ex:PersonGivenName />
    <ex:PersonFamilyName />
    <ex:PersonBirthDate />
  </ex:Person>
...

可以使用<xs:element/>标记的minOccursmaxOccurs属性更改出现次数。

XML 架构文件 符合要求的 XML 文件示例
...
  <xs:element name="Person">
     <xs:complexType>
        <xs:sequence>
           <xs:element name="PersonGivenName" minOccurs="0" maxOccurs="1"/>
           <xs:element name="PersonFamilyName" minOccurs="3" maxOccurs="unbounded"/>
           <xs:element name="PersonBirthDate" minOccurs="2" maxOccurs="2"/>
        </xs:sequence>
     </xs:complexType>
  </xs:element>
...
...
  <ex:Person>
    <ex:PersonFamilyName/>
    <ex:PersonFamilyName/>
    <ex:PersonFamilyName/>
    <ex:PersonFamilyName/>
    <ex:PersonBirthDate/>
    <ex:PersonBirthDate/>
  </ex:Person>
...

默认情况下,最小出现次数为 1,最大出现次数为 1。要定义无限次出现,请指定unbounded

具有子元素和文本的复杂元素
[编辑 | 编辑源代码]

复杂元素可以在其主体中包含文本,这些文本位于其子元素之前、之间和之后,将mixed属性设置为true

XML 架构文件 符合要求的 XML 文件示例
...
  <xs:element name="Person">
     <xs:complexType mixed="true">
        <xs:sequence>
           <xs:element name="PersonGivenName" />
           <xs:element name="PersonFamilyName" />
        </xs:sequence>
     </xs:complexType>
  </xs:element>
...
...
  <ex:Person>
    You can add text before,
    <ex:PersonGivenName />
    between,
    <ex:PersonFamilyName />
    and after the sub-elements.
  </ex:Person>
...

默认情况下,mixed属性设置为false

复杂元素的属性

[编辑 | 编辑源代码]

可以使用<xs:attribute/>标记定义元素的属性。

XML 架构文件 符合要求的 XML 文件示例
...
  <xs:element name="Person">
     <xs:complexType>
        <xs:attribute name="relation"/>
     </xs:complexType>
  </xs:element>
...
...
  <ex:Person relation="a colleague"/>
...

如果元素同时包含属性和子元素,则<xs:attribute/>标记必须定义在<xs:all/><xs:sequence/><xs:choice/>标记之上。数据类型、限制和方面可以像仅文本主体元素一样为属性定义。

XML 架构文件 符合要求的 XML 文件示例
...
  <xs:element name="Person">
     <xs:complexType>
        <xs:sequence>
           <xs:element name="PersonGivenName" />
        </xs:sequence>        
        <xs:attribute name="professional"
            type=“xs:boolean”/>
        <xs:attribute name="gender">
           <xs:simpleType>
              <xs:restriction base="xs:string">
                 <xs:enumeration value="woman"/>
                 <xs:enumeration value="man"/>
              </xs:restriction>
           </xs:simpleType>
        </xs:attribute>
        
     </xs:complexType>
  </xs:element>
...
...
  <ex:Person professional="true" gender="woman">
    <ex:PersonGivenName />
  </ex:Person>
...

默认情况下,属性是可选的。这可以使用use属性更改。

  • 如果其值为optional,则可以省略属性。
  • 如果其值为required,则属性必须存在。

可以使用default属性定义默认值。如果属性不存在,解析器将认为属性存在,其值为默认值。

可以使用fixed属性将属性限制为一个常量值。由于fixed属性也用作默认值,因此您不能同时定义default属性。

XML 架构文件 符合要求的 XML 文件示例
...
  <xs:element name="Person">
     <xs:complexType>
        <xs:attribute name="professional" use=“required”/>
        <xs:attribute name="gender" fixed="woman"/>
        <xs:attribute name="comment" default="no comment"/>
     </xs:complexType>
  </xs:element>
...
...
  <ex:Person professional="true" comment="supplier"/>
...
...
  <ex:Person gender="woman" professional="false"/>
...
具有属性和文本主体的复杂元素
[编辑 | 编辑源代码]

元素可以使用<xs:simpleContent/>标记同时包含属性和文本内容(请记住,简单类型元素不能包含属性)。

XML 架构文件 符合要求的 XML 文件示例
...
  <xs:element name="Person">
     <xs:complexType>
       <xs:simpleContent>
          <xs:extension base="xs:positiveInteger">
            <xs:attribute name="lastUpdate" type="xs:date" />
          </xs:extension>
        </xs:simpleContent>
     </xs:complexType>
  </xs:element>
...
...
  <ex:Person lastUpdate="2009-09-10">
    1864
  </ex:Person>
...

类型定义

[编辑 | 编辑源代码]

简单类型和复杂类型可以在元素树之外定义。在这种情况下,<xs:element/>标记没有主体,保留其name属性,并有一个type属性。然后在根元素之外定义<xs:complexType/>标记,其name属性包含元素类型名称。对XML文件验证没有变化。让我们看一下这个XML模式

XML 架构文件 符合要求的 XML 文件示例
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.org/contactExample"
    xmlns:tns="http://www.example.org/contactExample"
    elementFormDefault="qualified">

  <xs:element name="Contacts">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Person">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="PersonGivenName" />
              <xs:element name="PersonFamilyName" />
              <xs:element name="PersonBirthDate" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
      <xs:attribute name="LastUpdate">
        <xs:simpleType>
          <xs:restriction base="xs:date">
            <xs:minExclusive value="2003-05-06"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
    </xs:complexType>
  </xs:element>

</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<ex:Contacts xmlns:ex="http://www.example.org/contactExample"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.example.org/contactExample contactExample.xsd"
    LastUpdate="2003-05-07">
  <ex:Person>
    <ex:PersonGivenName/>
    <ex:PersonFamilyName/>
    <ex:PersonBirthDate/>
  </ex:Person>
</ex:Contacts>

现在,让我们在根元素树之外定义Person复杂类型和LastUpdate简单类型

XML 架构文件 符合要求的 XML 文件示例
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.org/contactExample"
    xmlns:tns="http://www.example.org/contactExample"
    elementFormDefault="qualified">

  <xs:complexType name="PersonType">
    <xs:sequence>
      <xs:element name="PersonGivenName" />
      <xs:element name="PersonFamilyName" />
      <xs:element name="PersonBirthDate" />
    </xs:sequence>
  </xs:complexType>

  <xs:simpleType name="LastUpdateType">
    <xs:restriction base="xs:date">
      <xs:minExclusive value="2003-05-06"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:element name="Contacts">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Person" type="PersonType"/>
      </xs:sequence>
      <xs:attribute name="LastUpdate" type="LastUpdateType"/>
    </xs:complexType>
  </xs:element>

</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<ex:Contacts xmlns:ex="http://www.example.org/contactExample"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.example.org/contactExample contactExample.xsd"
    LastUpdate="2003-05-07">
  <ex:Person>
    <ex:PersonGivenName/>
    <ex:PersonFamilyName/>
    <ex:PersonBirthDate/>
  </ex:Person>
</ex:Contacts>

复杂类型和简单类型可以以任何顺序定义。定义的类型可以在模式的不同元素中重复使用,从而避免重复其描述。它避免了XSD文件过度缩进。此外,使用类型定义,元素不仅具有名称,而且还具有类型名称,该类型名称也可以用作类名称。某些用于根据XML模式解析XML内容的工具可能需要复杂类型元素的类型名称。

元素和属性引用

[编辑 | 编辑源代码]

元素和属性可以使用引用重复使用。在这种情况下,<xs:element/>标记或<xs:attribute/>标记没有主体,没有name属性,并有一个ref属性。此ref属性包含另一个元素或另一个属性的名称。让我们在之前示例的Person元素上使用一个引用

XML 架构文件 符合要求的 XML 文件示例
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.org/contactExample"
    xmlns:tns="http://www.example.org/contactExample"
    elementFormDefault="qualified">

  <xs:element name="Person">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="PersonGivenName" />
        <xs:element name="PersonFamilyName" />
        <xs:element name="PersonBirthDate" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:simpleType name="LastUpdateType">
    <xs:restriction base="xs:date">
      <xs:minExclusive value="2003-05-06"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:element name="Contacts">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="Person"/>
      </xs:sequence>
      <xs:attribute name="LastUpdate" type="LastUpdateType"/>
    </xs:complexType>
  </xs:element>

</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<ex:Contacts xmlns:ex="http://www.example.org/contactExample"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.example.org/contactExample contactExample.xsd"
    LastUpdate="2003-05-07">
  <ex:Person>
    <ex:PersonGivenName/>
    <ex:PersonFamilyName/>
    <ex:PersonBirthDate/>
  </ex:Person>
</ex:Contacts>

上面单独类型定义与使用引用之间的区别在于,任何元素或属性都可以被引用。此外,使用引用,链接是使用名称而不是类型名称完成的。这意味着我们链接的不是类,而是类的实例。

定义的复杂类型可以重复使用,添加子元素或属性。然后扩展复杂类型。可以使用<xs:complexContent/><xs:extension/>标记来完成此操作。扩展类型名称在<xs:extension/>标记的base属性中定义。以下是一个示例,其中PersonType复杂类型通过为Person元素添加professional属性来扩展

XML 架构文件 符合要求的 XML 文件示例
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.org/contactExample"
    xmlns:tns="http://www.example.org/contactExample"
    elementFormDefault="qualified">

  <xs:complexType name="PersonType">
    <xs:sequence>
      <xs:element name="PersonGivenName" />
      <xs:element name="PersonFamilyName" />
      <xs:element name="PersonBirthDate" />
    </xs:sequence>
  </xs:complexType>

  <xs:element name="Contacts">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Person">
          <xs:complexType>
            <xs:complexContent>
              <xs:extension base="PersonType">
                <xs:attribute name="professional" type="xs:boolean"/>
              </xs:extension>
            </xs:complexContent>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<ex:Contacts xmlns:ex="http://www.example.org/contactExample"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.example.org/contactExample contactExample.xsd">
  <ex:Person professional="true">
    <ex:PersonGivenName/>
    <ex:PersonFamilyName/>
    <ex:PersonBirthDate/>
  </ex:Person>
</ex:Contacts>

可以像这样定义具有公共和不同子元素或属性的各种元素。公共项将在一个公共复杂类型中定义,不同项将在扩展第一个复杂类型的不同复杂类型中定义。

实例文档属性

[编辑 | 编辑源代码]
属性 解释 示例
xsi:nil 指示某个元素没有值或值未知。  元素必须在模式文档中设置为可为空

<xs:element name=”last_name” type=”xs: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=”xs:decimal”>78.9</height>

另请参阅

[编辑 | 编辑源代码]
华夏公益教科书