W3C XML Schema 定义语言是描述和约束XML文档内容的XML语言,W3C推荐使用W3C XML Schema。
本文介绍了如何使用W3C XML Schema,还包括了对Schema数据类型和结构的完整参考。
第一个Schema
让我们从一个描述一本书的简单文档开始:
< book isbn ="0836217462" >
< title >
Being a Dog Is a Full-Time Job
</ title >
< author > Charles M. Schulz </ author >
< character >
< name > Snoopy </ name >
< friend-of > Peppermint Patty </ friend-of >
< since > 1950-10-04 </ since >
< qualification >
extroverted beagle
</ qualification >
</ character >
< character >
< name > Peppermint Patty </ name >
< since > 1966-08-22 </ since >
< qualification > bold, brash and tomboyish </ qualification >
</ character >
</ book >
要为这份文档写一份scheme,可以从它的结构和定义我们看到的每个元素开始,我们现在从xs:schema元素开始:
< xs:schema
xmlns:xs ="http://www.w3.org/2001/XMLSchema" >
.../...
</ xs:schema >
定义从schema 元素开始,它也包括了目标名称空间的定义和几个默认选项,我们会在下面章节中看到它们。
为了匹配book 元素标签,我们定义一个叫做book的元素。这个元素具有属性而无文字子节点,因此我们认为它是一个complexType (因为另一个数据类型simpleType 是只包括数据值而没有子节点或者属性),book元素的子节点使用sequence 元素进行定义:
< xs:element name ="book" >
< xs:complexType >
< xs:sequence >
.../...
</ xs:sequence >
.../...
</ xs:complexType >
</ xs:element >
sequence 定义了顺序的子元素,接下来的章节还会探讨另外两个同样的元素:choice和all。
现在,我们来定义title和author元素为简单类型——因为它们没有包含属性和非文本元素,并且可以在一个退化的元素element 内部直接描述。类型(xs:string)是被预先加了XML scheme相关的名称空间前缀,表示为预定义的XML scheme数据类型:
< xs:element name ="author" type ="xs:string" />
现在,我们必须来处理character 元素了,它是一个复杂类型,注意它的基数(cardinality )是如何定义的:
< xs:complexType >
< xs:sequence >
.../...
</ xs:sequence >
</ xs:complexType >
</ xs:element >
不像其他的scheme定义语言,W3C XML Schema 允许我们定义一个元素的精密基数(例如:可能的数目),我们可以一起指定minOccurs(最小可能)和maxOccurs (最大可能),这里maxOccurs 设置为unbounded 意思是该节点无最大数目限制,可以任意多。
我们使用同样的方式指定所有的子节点:
< xs:element name ="friend-of" type ="xs:string" minOccurs ="0" maxOccurs ="unbounded" />
< xs:element name ="since" type ="xs:date" />
< xs:element name ="qualification" type ="xs:string" />
我们现在可以声明元素的属性了,一般在最后这样做。似乎并没有什么特别的理由这样做,但是W3C XML Schema工作组已经认为在一种复杂的类型内把一项有关的命令强加到元素列表和属性的定义更简单,并且在元素之后定义属性是更自然的。
就是这样!第一次的设计,有时也被称为“俄罗斯玩偶设计”,紧随我们示例文档的结构。
其中这样的设计的一个关键特点是定义一个上下文中的每个元素和属性,并允许多个事件的同一元素的名称,进行不同的定义。
本例的完整scheme定义如下:
< xs:schema xmlns:xs ="http://www.w3.org/2001/XMLSchema" >
< xs:element name ="book" >
< xs:complexType >
< xs:sequence >
< xs:element name ="title" type ="xs:string" />
< xs:element name ="author" type ="xs:string" />
< xs:element name ="character" minOccurs ="0" maxOccurs ="unbounded" >
< xs:complexType >
< xs:sequence >
< xs:element name ="name" type ="xs:string" />
< xs:element name ="friend-of" type ="xs:string" minOccurs ="0"
maxOccurs ="unbounded" />
< xs:element name ="since" type ="xs:date" />
< xs:element name ="qualification" type ="xs:string" />
</ xs:sequence >
</ xs:complexType >
</ xs:element >
</ xs:sequence >
< xs:attribute name ="isbn" type ="xs:string" />
</ xs:complexType >
</ xs:element >
</ xs:schema >
下面的章节探讨了如何细分模式设计,以使它们更具可读性和可维护性。
使用W3C XML Schema(2)