模型组元素
如果一个元素的内容是纯元素内容(该元素的内容只包含子元素,没有字符数据),可以使用模型组来构建纯元素的内容。模型组元素有3种,分别是:sequence、choice、all。
sequence:表示序列,sequence组中的所有子元素要按照指定的顺序出现。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="employee" type="empType"/>
<xs:complexType name="empType">
<xs:complexContent>
<xs:restriction base="xs:anyType">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
</xs:schema>
XML Schema规定,如果一个具有复杂内容的复杂类型定义是anyType类型限制派生(<xs:restriction base="xs:anyType">),那么可以省略xs:complexContent和xs:restriction元素,而直接在xs:complexType元素下使用模型组。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="employee" type="empType"/>
<xs:complexType name="empType">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
choice:表示选择,从所有子元素中选择任意一个,且只能使用一个。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="employee">
<xs:complexType>
<xs:choice>
<xs:element name="telephone">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:pattern value="\d{3,4}-\d{7,8}"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="mobile">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:pattern value="\d{11}"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
ALL:表示任意次序,all组中的所有子元素可以以任意顺序出现,但只能出现一次(即minOccurs和maxOccurs都只能为1)。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="employee" type="empType"/>
<xs:complexType name="empType">
<xs:all>
<xs:element name="number" type="xs:integer"/>
<xs:element name="name" type="xs:string"/>
</xs:all>
</xs:complexType>
</xs:schema>
指示符
可以使用指示符来控制元素出现的次数,指示符是minOccurs和maxOccurs,这两个属性可以在模型组元素(xs:sequence、xs:choice、xs:all)或者xs:element上使用。minOccurs属性指定元素出现的最小次数,maxOccurs属性指定元素出现的最大次数,这两个属性的默认值都是1。unbounded表示不限次数。全局声明的元素不能包含minOccurs和maxOccurs属性。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="employee" type="empType"/>
<xs:complexType name="empType">
<xs:all>
<xs:element name="number" type="xs:integer" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="name" type="xs:string" minOccurs="1" maxOccurs="unbounded"/>
</xs:all>
</xs:complexType>
</xs:schema>
元素的默认值和固定值
元素的默认值使用xs:element的default属性来定义。模式处理器在处理元素的默认值和属性的默认值时有些不同,当属性不出现时默认的属性被应用,当元素内容为空时默认的属性被应用。如果元素没有出现,则模式处理器根本不为该元素应用默认值。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="document">
<xs:complexType>
<xs:sequence>
<xs:element name="title" minOccurs="1" maxOccurs="1"/>
<xs:element name="format" default="PDF"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
元素的混合内容
如果一个元素既包含子元素,又包含字符数据,那么元素的内容为混合内容。要定义具有混合内容的元素,可以是使用mixed属性。设置mixed=true,表示可以是混合内容(如果内容不是混合内容,也是可以的)。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="document">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element name="title" type="xs:string"/>
<xs:element name="format" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xs5.xml">
title:<title>C#</title>
<format>PDF</format>
</document>
元素组
把常用的元素放到一个组里,可以便于维护。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="company" type="companyType"/>
<xs:complexType name="companyType">
<xs:sequence>
<xs:element name="employee" type="empType" maxOccurs="unbounded"/>
<xs:element name="manager" type="empType" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="empType">
<xs:sequence>
<xs:group ref="empGroup"/>
</xs:sequence>
</xs:complexType>
<xs:group name="empGroup">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
</xs:sequence>
</xs:group>
</xs:schema>