XML Schema定义了一组规则,用于描述XML文档的结构。在构建复杂的XML文档时,可能会遇到需要扩展现有类型或者定义新的类型的情况。本文将介绍一些XML Schema中较少使用的构造,包括元素和属性组、
在XMLSchema中,可以通过<xs:group>
和<xs:attributeGroup>
来定义元素和属性的组。这些组可以在模式定义的其他位置被引用。组必须具有唯一的名称,并且作为<xs:schema>
元素的子元素定义。当引用一个组时,就好像它的内容包括在引用它的位置一样。
需要注意的是,<xs:group>
和<xs:attributeGroup>
不能像<xs:complexType>
或<xs:simpleType>
那样被扩展或限制。它们纯粹是为了将总是一起使用的数据项分组。因此,它们不是构建可重用和可维护模式的首选构造,但它们也有其用途。
例如,可以定义一个名为"CustomerDataGroup"的元素组,如下所示:
<xs:group name="CustomerDataGroup">
<xs:sequence>
<xs:element name="Forename" type="xs:string" />
<xs:element name="Surname" type="xs:string" />
<xs:element name="Dob" type="xs:date" />
</xs:sequence>
</xs:group>
然后,可以在复杂类型的定义中引用这个组:
<xs:complexType name="Customer">
<xs:sequence>
<xs:group ref="CustomerDataGroup" />
<xs:element name="..." type="..." />
</xs:sequence>
</xs:complexType>
<xs:any>
构造允许指定XML文档可以包含未在此模式中定义的元素。这在定义消息信封时非常有用。例如,消息的有效载荷对系统来说是未知的,但仍然可以验证消息。
以下是一个示例模式:
<xs:element name="Message">
<xs:complexType>
<xs:sequence>
<xs:element name="DateSent" type="xs:date" />
<xs:element name="Sender" type="xs:string" />
<xs:element name="Content">
<xs:complexType>
<xs:sequence>
<xs:any />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
在这个模式中,定义了一个名为"Message"的元素,它必须有一个名为"DateSent"的子元素(日期),一个名为"Sender"的子元素(字符串),以及一个名为"Content"的子元素,它可以包含任何元素,甚至不需要在模式中描述。
例如,以下XML将是有效的:
<Message>
<DateSent>2000-01-12</DateSent>
<Sender>Admin</Sender>
<Content>
<AccountCreationRequest>
<AccountName>Fred</AccountName>
</AccountCreationRequest>
</Content>
</Message>
<xs:any>
构造有一些属性可以进一步限制其替代内容。例如,minOccurs
和maxOccurs
允许指定XML文档中必须放置多少个未定义元素的实例。namespace
属性允许指定未定义元素必须属于给定的命名空间。此外,还有三个内置值:##any、##other和##targetnamespace。有关更多信息,请参考XSD标准。
processContents
属性告诉XML解析器如何处理未知元素。值包括:
<xs:anyAttribute>
的工作方式与<xs:any>
完全相同,但它允许在给定元素中插入未知属性。
例如,可以定义一个允许在"Sender"元素中添加任何属性的模式:
<xs:element name="Sender">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:anyAttribute />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
这意味着可以在"Sender"元素中添加任何喜欢的属性,XML文档仍然有效。例如:
<Sender ID="7687">Fred</Sender>
在XML Schema中,命名空间用于区分不同来源的元素和属性。通过使用命名空间,可以在同一个文档中使用来自不同来源的元素和属性,而不会相互冲突。
命名空间由一个URI和一个可选的前缀组成。在XMLSchema中,可以使用targetNamespace
属性来定义模式的默认命名空间。此外,可以使用xmlns
属性来定义元素和属性的命名空间。
例如,以下模式定义了一个默认命名空间:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.com/customer"
xmlns="http://www.example.com/customer">
...
</xs:schema>