5.1 使用anyType定义任意类型

前一章所介绍的所有元素都是字符串内容的元素,而且从未定义属性——这是因为Schema采用一致的方式来定义元素和属性,即使我们在Schema中定义了属性,但由于属性不能独立存在(属性必须依附于元素),如果没有指定元素和属性之间的关联关系,那也无法使用那些属性。类似地,前面的示例程序也从未在元素里包含其他子元素,这也是因为我们没有指定各元素之间的包含关系。

下面将介绍anyType类型,这种类型的元素将没有任何限制,它与DTD中的ANY类型相似。如下Schema中定义了一个<book_list…/>元素,该元素的类型是anyType:

程序清单:codes\05\5.1\anyType.xsd

alt

由于上面的Schema中定义的<book_list…/>元素的类型是anyType,因此该元素的内容完全不受限制,它即可包含子元素,也可包含字符串内容,还可添加任何属性(只要Schema中定义过该属性)。对于该Schema,如下XML文档是有效的:

程序清单:codes\05\5.1\anyType.xml

alt

如上所示,当指定某个元素的类型是anyType时,就意味着该元素的内容不受任何限制,这显然与定义语义约束的初衷不符,因此应尽量避免将某个元素的类型定义为anyType。

anyType是所有简单类型和复杂类型的基类型,它通常用于派生新的类型,而不是直接用来定义元素。