XML 架构
维基教科书用户认为此页面应该拆分为更小的页面,并具有更窄的子主题。 您可以通过将此大页面拆分为更小的页面来提供帮助。请确保遵循命名规则。将书籍分为更小的部分可以提供更多重点,并允许每个部分专注于做好一件事,这对每个人都有益。 |
读者请求扩展此书籍以包含更多资料。 您可以通过添加新资料(学习方法)或在阅览室中寻求帮助。 |
欢迎来到XML 架构书籍。它描述了 XML 架构的结构,并解释了如何使用 XML 架构来验证 XML 文档。
阅读本书的学生应该已经熟悉XML 的基本原理,并对数据类型 有一定的了解。
只有前缀、根元素:<xs:schema> 和元素 部分是构建 XML 架构所必需的。可以跳过XML 架构的历史、XML 架构用于什么?、当 XML 架构在验证复杂规则方面变得效率低下时 和XML 架构示例,后面的部分是从最重要的部分开始的附加信息。
XML 架构 是由万维网联盟 (W3C) 创建的标准http://www.w3c.org。与 DTD 不同,XML 架构使用 XML 文件格式来定义 XML 架构本身。一旦你学习了 XML 文件的结构,你就不需要学习另一种语法。
XML 架构主要用于验证 XML 文档的结构和数据类型。就结构而言,XML 架构定义了
- 预期哪些数据元素
- 预期数据元素的顺序
- 这些数据元素的嵌套情况
- 哪些数据元素是可选的,哪些数据元素是必需的
XML 架构还可以被 XML 数据映射工具用于快速从数据库中提取数据并将其转移到 XML 文件中。
最好的类比之一是蓝图类比。就像建筑蓝图描述房屋的结构设计一样,XML 架构提供了文件的“结构设计”。
尽管 XML 架构非常擅长对数据元素和数据类型进行顺序验证,但它们在表达高度复杂的业务规则方面往往很笨拙。例如,当你到达一个大型文件的末尾时,很难制定一条规则来检查一个数据元素是否具有另一个数据元素在文件开头应该具有的另一个值。这可以通过使用 XML 转换和 XPath 表达式来实现。
以下是一个完整的 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 version="1.0"?>
) 开头,后面是根元素 (始终是 xs:schema
)。
尽管可以使用任何前缀来引用命名空间http://www.w3.org/2001/XMLSchema,但最常见的约定是使用“xs”。有些人更喜欢“xsd”;有些人更喜欢使用默认命名空间(这意味着不需要使用前缀)。所有 XML 架构元素都在此命名空间中。
所有 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/>
标记的minOccurs
和maxOccurs
属性更改出现次数。
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> |