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>