定义元素就是定义元素的 名字 和 内容模型 。
在 XML Schema 中,元素的 内容模型 由其 类型 定义,因此 XML 文档中实例元素的值必须符合模式中定义的类型。
类型包括简单类型和复杂类型。
简单类型的值不能包含元素或属性。XML Schema 规范也包括预定义的简单类型。 派生的简单类型约束了基类型的值。
复杂类型可以产生在其他元素中嵌套元素的效果,或者为元素增加属性。
1、简单的、非嵌套的元素是简单类型
不含属性或其他元素的元素可以定义为简单类型,无论是预定义的简单类型还是用户定义的简单类型,如 预定义的简单类型:string 、 integer 、 decimal 、 time ; 用户定义的简单类型:ProductCode 等等。
简单类型定义
<element name='age' type='integer'/> <element name='price' type='ProductCode'/>
2、使用基类型来定义新的简单类型,建立一个新的整数类型称为myInteger,它的值范围为10000到99999:
<xsd:simpleType name="myInteger"> <xsd:restriction base="xsd:integer"> <xsd:minInclusive value="10000"/> <xsd:maxInclusive value="99999"/> </xsd:restriction> </xsd:simpleType>
3、带有属性的元素必须是复杂类型。一个复杂元素类型:
<element name='price'> <complexType base='decimal' derivedBy='extension'> <attribute name='currency' type='string'/> </complexType> </element> <!-- In XML instance document, we can write: <price currency='US'>45.50</price> -->
在例子中,我们定义了一个 匿名类型,没有明确地命名这个复杂类型。换句话说,没有定义复杂类型 complexType 的 name 属性。
4、嵌入其他元素的元素必须是复杂类型
<element name='Book' type='BookType'/> <complexType name='BookType'> <element name='Title' type='string'/> <element name='Author' type='string'/> </complexType>
5、用全局简单类型定义的复杂类型
<element name='Title' type='string'/> <element name='Author' type='string'/> <element name='Book' type='BookType'/> <complexType name='BookType'> <element ref='Title'/> <element ref='Author'/> </complexType>
在例子中, BookType 是全局性的,可用于声明其他元素。元素 Title 、 Author 和 Book 也是全局范围的。
元素 element 的 ref 属性使您能够引用前面声明的元素。
6、隐藏 BookType 作为本地类型
<element name='Title' type='string'/> <element name='Author' type='string'/> <element name='Book'> <complexType> <element ref='Title'/> <element ref='Author'/> </complexType> </element>
7、表示元素类型的约束
<element name='Title' type='string'/> <element name='Author' type='string'/> <element name='Book'> <complexType> <element ref='Title' minOccurs='0'/> <element ref='Author' maxOccurs='2'/> </complexType> </element>
对于表示元素内容模型的约束,XML Schema 比 DTD 提供了更大的灵活性。
在最简单的层次上,像在 DTD 中那样,您可以把属性和元素声明关联起来,指明能够出现的给定元素集合序列:只能出现 1 次(1)、出现 0 次或多次(*)或者出现 1 次或多次(+)。
您还可以表示 XML Schema 中的其他约束,比方说使用 element 元素的 minOccurs 和 maxOccurs 属性,以及 choice 、 group 和 all 元素。
在例子中, Book 中 Title 的出现是可选的(类似 DTD 的 '?')。
但是, 例子也说明 Book 元素中至少要有一个但不能超过两个 Author 。
element 的 minOccurs 和 maxOccurs 属性的默认值是 1。
元素 choice 只允许它的一个子女出现在实例中。
另外一个元素 all ,表示这样的约束:组中的所有子元素可以同时出现一次,或者都不出现,它们可以按任意的顺序出现。
8、指出必须为元素定义所有的类型
<xsd:element name='Title' type='string'/> <xsd:element name='Author' type='string'/> <xsd:element name='Book'> <xsd:complexType> <xsd:all> <xsd:element ref='Tile'/> <xsd:element ref='Author'/> </xsd:all> </xsd:complexType> </xsd:element>
例子表示 Title 和 Author 两者必须同时出现(顺序任意)在 Book 中,或者都不出现。这种约束很难在 DTD 中表示。