XML Schema扩展与命名空间

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>构造有一些属性可以进一步限制其替代内容。例如,minOccursmaxOccurs允许指定XML文档中必须放置多少个未定义元素的实例。namespace属性允许指定未定义元素必须属于给定的命名空间。此外,还有三个内置值:##any、##other和##targetnamespace。有关更多信息,请参考XSD标准。

processContents属性告诉XML解析器如何处理未知元素。值包括:

  • Skip - 不执行验证,但必须是格式良好的XML
  • Lax - 如果有模式可以验证元素,则必须符合该模式;如果没有模式,则可以。
  • Strict - 必须有元素的定义可供解析器使用,并且必须符合该定义。

属性

<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>
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485