7.XSD 复合元素 -- 复合元素指包含其他元素 及/或 属性的 XML 元素
a.有四种类型的复合元素(这些元素均可包含属性):@空元素 @包含其他元素的元素 @仅包含文本的元素 @包含元素和文本的元素
#复合元素,"product",是空的:<product pid="1345"/>
#复合元素,"employee",仅包含其他元素:
<employee>
<firstname>John</firstname>
<lastname>Smith</lastname>
</employee>
#复合元素,"food",仅包含文本:
<food type="dessert">Ice cream</food>
#复合元素,"description",包含元素和文本:
<description>
It happened on <date lang="norwegian">03.03.99</date> ....
</description>
b.两种半方式来定义复合元素
1. 通过命名此元素,可直接对"employee"元素进行声明,就像这样:
<xs:element name="employee">
<xs:complexType>
<xs:sequence><!-- 表示子元素必须按声明的次序出现 -->
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
2. "employee" 元素可以使用 type 属性,这个属性的作用是引用要使用的复合类型的名称
<xs:element name="employee" type="personinfo"/>
<xs:complexType name="personinfo"><!-- 类型可以复用 -->
<xs:sequence><!-- 依然得按照次序 -->
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
2.5. 也可以在已有的复合元素之上以某个复合元素为基础,然后添加一些元素,就像这样
<xs:element name="employee" type="fullpersoninfo"/>
<xs:complexType name="personinfo">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="fullpersoninfo">
<xs:complexContent><!-- 表明将要拓展personinfo -->
<xs:extension base="personinfo"><!-- 表示基于原来的类型 -->
<xs:sequence>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
8.XSD 复合空元素 -- 不能包含内容与元素,只能含有属性
<!--为了定义无内容的类型,我们就必须声明一个在其内容中只能包含元素的类型,但是实际上我们并不会声明任何元素-->
<xs:element name="product">
<xs:complexType>
<xs:complexContent>
<xs:restriction base="xs:integer"><!-- integer 限定则声明了一个属性但不会引入任何的元素内容 -->
<xs:attribute name="prodid" type="xs:positiveInteger"/>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
</xs:element>
<!-- 或者一种紧凑的方式 -->
<xs:element name="product">
<xs:complexType>
<xs:attribute name="prodid" type="xs:positiveInteger"/>
</xs:complexType>
</xs:element>
<!-- 或者另一种紧凑的方式 -->
<xs:element name="product" type="prodtype"/>
<xs:complexType name="prodtype">
<xs:attribute name="prodid" type="xs:positiveInteger"/>
</xs:complexType>
9.XSD 仅含元素复合类型 -- 仅包含其他元素的元素和属性
<xs:element name="person">
<xs:complexType>
<xs:sequence><!-- 子元素依照次序出现 -->
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- 另一种方式 -->
<xs:element name="person" type="persontype"/>
<xs:complexType name="persontype">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
10.XSD 仅含文本复合元素 -- 仅含文本的复合元素 可包含文本和属性
<shoesize country="france">35</shoesize>定义如下:
<xs:element name="shoesize"><!-- 声明了一个复合类型,其内容被定义为整数值,并且 "shoesize" 元素含有名为 "country" 的属性 -->
<xs:complexType>
<xs:simpleContent> <!-- 仅包含简易的内容(文本和属性) -->
<xs:extension base="xs:integer"><!-- 扩展基本简易类型 也可以<xs:restriction base="basetype">限制元素的基本简易类型 -->
<xs:attribute name="country" type="xs:string" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
11.XSD 带有混合内容的复合类型 -- 混合的复合类型可包含属性、元素以及文本
<letter>
Dear Mr.<name>John Smith</name>.
Your order <orderid>1032</orderid>
will be shipped on <shipdate>2001-07-13</shipdate>.
</letter>
定义如下:
<xs:element name="letter">
<xs:complexType mixed="true"><!-- 为了使字符数据可以出现在"letter"的子元素之间,mixed属性必须被设置为"true" -->
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="orderid" type="xs:positiveInteger"/>
<xs:element name="shipdate" type="xs:date"/>
</xs:sequence>
</xs:complexType>
</xs:element>
12.XSD 复合类型指示器(七种) -- 控制在文档中使用元素的方式
*Order 指示器--定义元素的顺序 : All Choice Sequence
*Occurrence 指示器--定义某个元素出现的频率:maxOccurs minOccurs
*Group 指示器--定义相关的数批元素: Group name attributeGroup name
a.All 指示器 <all> 指示器规定子元素可以按照任意顺序出现,且每个子元素必须只出现一次
b.Choice 指示器 <choice> 指示器规定可出现某个子元素或者可出现另外一个子元素(非此即彼)
c.Sequence 指示器 <sequence> 规定子元素必须按照特定的顺序出现
d.maxOccurs 以及 minOccurs 的默认值均为 1
e.maxOccurs 指示器 <maxOccurs> 指示器可规定某个元素可出现的{zd0}次数
f.minOccurs 指示器 <minOccurs> 指示器可规定某个元素能够出现的最小次数
<!-- 子元素 "child_name" 可在 "person" 元素中出现最少 0 次,最多出现 10 次 -->
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="full_name" type="xs:string"/>
<xs:element name="child_name" type="xs:string" maxOccurs="10" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- 一个对应的例子 -->
<?xml version="1.0" encoding="ISO-8859-1"?>
<persons xmlns:xsi="" xsi:noNamespaceSchemaLocation="family.xsd">
<person>
<full_name>Tony Smith</full_name>
<child_name>Cecilie</child_name>
</person>
<person>
<full_name>David Smith</full_name>
<child_name>Jogn</child_name>
<child_name>mike</child_name>
<child_name>kyle</child_name>
<child_name>mary</child_name>
</person>
<person>
<full_name>Michael Smith</full_name>
</person>
</persons>
g.元素组 必须在 <group> 声明内部定义一个 all、choice 或者 sequence 元素
<xs:group name="persongroup">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
<xs:element name="birthday" type="xs:date"/>
</xs:sequence>
</xs:group>
<xs:element name="person" type="personinfo"/>
<xs:complexType name="personinfo">
<xs:sequence>
<xs:group ref="persongroup"/><!-- 引用元素组 -->
<xs:element name="country" type="xs:string"/>
</xs:sequence>
</xs:complexType>
h.属性组 通过 <attributeGroup> 声明来进行定义
<xs:attributeGroup name="personattrgroup">
<xs:attribute name="firstname" type="xs:string"/>
<xs:attribute name="lastname" type="xs:string"/>
<xs:attribute name="birthday" type="xs:date"/>
</xs:attributeGroup>
<xs:element name="person">
<xs:complexType>
<xs:attributeGroup ref="personattrgroup"/><!-- 引用属性组 -->
</xs:complexType>
</xs:element>