XML Schema设计指南

设计XMLSchema时,遵循一些约定和建议可以帮助创建更加清晰、易于维护的文档结构。本文将介绍元素与属性的使用时机、混合内容的处理、命名约定以及版本控制的策略。

元素与属性的使用

在XML中,元素(Element)和属性(Attribute)的使用常常让人感到困惑。一些人认为元素用于描述数据,而属性用于描述元数据。另一种看法是属性用于存储小数据片段,如订单ID。但事实上,何时使用属性往往取决于个人偏好。通常,如果信息看起来像是数据,最好使用子元素。使用属性可能会遇到以下问题:

  • 属性不能包含多个值(子元素可以)
  • 属性不容易扩展(以适应未来模式的变更)
  • 属性不能描述结构(子元素可以)

如果使用属性作为数据的容器,最终得到的文档将难以阅读和维护。因此,建议使用元素来描述数据。元数据(关于数据的数据)应该存储为属性,而数据本身应该存储为元素。

避免混合内容

混合内容(Mixed Content)应该尽可能避免使用。虽然在Web上以XHTML的形式广泛使用,但它有许多限制。混合内容难以解析,并且可能导致数据结果的复杂性增加。XML数据绑定与之相关的限制使得操作这类文档变得困难。

命名约定

所有元素和属性应使用UCC驼峰命名法,例如(PostalAddress),避免使用连字符、空格或其他语法。

可读性比标签长度更重要。在文档大小和可读性之间总是需要权衡,尽可能优先考虑可读性。

尽量避免缩写和首字母缩写用于元素、属性和类型名称。例外情况应该是在业务领域内众所周知的,例如,ID(标识符)和POS(销售点)。

为新类型后缀添加“Type”,例如,AddressType,USAddressType。

枚举应使用名称而不是数字,并且值应使用UCC驼峰命名法。

名称不应包含包含结构的名称,例如,CustomerName 应为 Name 在子元素 Customer 内。

只为可能被重用的类型产生复杂类型(complexTypes)或简单类型(simpleTypes)。如果结构仅在一个地方存在,应定义为匿名复杂类型。

避免使用混合内容。

只有在元素能够成为XML文档的根元素时,才定义根级别元素。

使用一致的命名空间别名:

  • xml(定义在XML标准中)
  • xmlns(定义在XML命名空间标准中)
  • xs http://www.w3.org/2001/XMLSchema
  • xsi http://www.w3.org/2001/XMLSchema-instance

设计模式的早期阶段就考虑版本控制。如果新版本的模式需要向后兼容,那么模式的所有添加都应该是可选的。如果现有产品能够读取给定文档的新版本很重要,那么考虑在定义的末尾添加any和anyAttribute条目。

定义目标命名空间

在模式中定义一个targetNamespace。这更好地标识了模式,并可以使模块化和重用变得更容易。

设置元素形式默认值

在模式元素中设置elementFormDefault="qualified"。这使得在结果XML中限定命名空间更简单(如果不是更冗长的话)。

代码示例

以下是一个简单的XML Schema示例,展示了如何定义元素和属性:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Customer"> <xs:complexType> <xs:sequence> <xs:element name="Name" type="xs:string"/> <xs:element name="Address" type="AddressType"/> </xs:sequence> </xs:complexType> </xs:element> <xs:complexType name="AddressType"> <xs:sequence> <xs:element name="Street" type="xs:string"/> <xs:element name="City" type="xs:string"/> <xs:element name="PostalCode" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:schema>
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485