六、
复杂类型:
a) 复合元素:指包含其他元素和/或属性的XML元素。有四种复合元素:空元素、包含其他元素的元素、仅包含文本的元素、包含元素和文本的元素。
b) 复合空元素:如一个空的XML元素:<product prodid="1345" />,为了定义这种无内容的类型,必须声明一个一个在其内容中只能包含元素的类型。有下列几种方法:
i. 带有复合内容的复合类型:
ii. 指定该复杂类型的属性名及属性类型
iii. 为compleType起一个名字,之后多个元素的type都可以引用该复杂类型了:
c) 仅含元素的复合类型元素:只能包含其他元素的元素。
如一个person含有firstname和secondname两个元素,并要求这两个元素顺序出现:
也可以将该复合类型定义为persontype,那么该persontype也可以被其他复合类型元素通过type引用。
d) 仅包含文本(简单内容)的复合元素:该复合元素可以包含文本和属性,这些都是简易的内容,所以需要向此内容添加simpleContent元素,
通过extension扩展:
restriction限定:
如一个鞋码为法国35码:<shoesize country="france">35</shoesize>,可以为shoesize的类型定义一个复杂类型shoetype:
e) 带有混合内容的复合类型:可包含文本、属性、元素。
如一封信的格式如下:
分析该封信,可知其中包含了多个元素:name、orderid和shipdate,且要求他们顺序出现,则可为letter定义lettertype:
七、 指示器:
a) Order指示器:用于定义元素的顺序,包含all,sequence和choice。
i. all指示器:子元素可以按照任意顺序出现,且每个子元素必须只出现一次。当使用all时,可将minOccurs置为0或1,但maxOccurs只能置为1!
ii. choice指示器:规定在子元素中选择一个出现,非此即彼。如需子元素可以出现任意次数,可通过maxOccurs来进行设置。
iii. sequence指示器:子元素必须按顺序出现。
b) Occurrence指示器:用于设置某个元素的出现频率。
i. minOccurs:最小出现次数,默认为1;
ii. maxOccurs:最大出现次数,unbounded表示出现次数不受限制。
如一个person必须有一个全名,可有0~5和孩子:
c) Group指示器:用于定义成批的元素,内部必须定义好是all、choice还是sequence。
i. 元素组:通过group定义。
如将一个person的firstname,lastname和birthday打包为一个元素组persongroup:
则在复杂类型定义中可以通过ref来使用该组:
ii. 属性组:通过attributeGroup定义。
如将一个person的firstname,lastname和birthday打包为一个属性组,可以通过类似的方式使用:
八、 Any元素:可以用来扩展xsd文档,将一个复杂类型中加入<xs:any minOccurs="0"/>,则可通过其他外部元素扩展原复杂类型。
注:可以通过在any/anyAttribute后跟namespace=”URI”来控制元素和属性的选取空间。
如一个person复杂类型元素:
可以在person中加入children元素来扩展,在使用中直接在person中加入child即可:
九、 anyAttribute:有类似any的扩展功能,针对属性进行扩展。
如对于一个person的复杂类型元素,原有firstname和lastname两个元素,没有定义任何属性,通过加入<xs:anyAttribute/>可使person类型的属性在使用时进行扩展,如加入性别gender属性:
加入的gender属性:
实例:
十、 复合元素重用:除了上面介绍的通过元素组的方式可以实现重用,也可以直接通过ref进行引用。
十一、 Import用法:???
十二、 elementFormDefault和attributeFormDefault:
unqualified:缺省;表明来自目标命名空间的元素不需要符合?命名空间前缀。(indicates that elements from the target namespace are not required to be qualified with the namespace prefix)
例子一:一份订单shiporder如下
为其定义Schema如下:
例子2:使用XML文档记录学生信息,根元素为students,可以包含若干个student:
Student_name 文本,必须出现;
Student_sex 文本,只能取男或女;
Student_MobilePhone 文本,手机电话号码,格式为11位数字,可出现一次或不出现;
Grade 子元素,成绩,包含至多7个子元素class。每个class包含一个属性class_id(ID类型,一定要出现)一个子元素<result>(整数,取值0),<class>的定义在class.xsd中,在命名空间www.ecnu.edu.cn/student中。
student.xsd:
a) 复合元素:指包含其他元素和/或属性的XML元素。有四种复合元素:空元素、包含其他元素的元素、仅包含文本的元素、包含元素和文本的元素。
b) 复合空元素:如一个空的XML元素:<product prodid="1345" />,为了定义这种无内容的类型,必须声明一个一个在其内容中只能包含元素的类型。有下列几种方法:
i. 带有复合内容的复合类型:
<xs:element name="product">
<xs:complexType>
<xs:complexContent> #打算限定或者扩展某个复合类型的内容模型
<xs:restriction base="xs:integer">
<xs:attribute name="prodid" type="xs:positiveInteger"/>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
</xs:element>
ii. 指定该复杂类型的属性名及属性类型
<xs:element name="product">
<xs:complexType>
<xs:attribute name="prodid" type="xs:positiveInteger"/>
</xs:complexType>
</xs:element>
iii. 为compleType起一个名字,之后多个元素的type都可以引用该复杂类型了:
<xs:element name="product" type="prodtype"/>
<xs:complexType name="prodtype">
<xs:attribute name="prodid" type="xs:positiveInteger"/>
</xs:complexType>
c) 仅含元素的复合类型元素:只能包含其他元素的元素。
如一个person含有firstname和secondname两个元素,并要求这两个元素顺序出现:
<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>
也可以将该复合类型定义为persontype,那么该persontype也可以被其他复合类型元素通过type引用。
d) 仅包含文本(简单内容)的复合元素:该复合元素可以包含文本和属性,这些都是简易的内容,所以需要向此内容添加simpleContent元素,
通过extension扩展:
<xs:complexType>
<xs:simpleContent>
<xs:extension base="basetype">
....
....
</xs:extension>
</xs:simpleContent>
</xs:complexType>
restriction限定:
<xs:complexType>
<xs:simpleContent>
<xs:restriction base="basetype">
....
....
</xs:restriction>
</xs:simpleContent>
</xs:complexType>
如一个鞋码为法国35码:<shoesize country="france">35</shoesize>,可以为shoesize的类型定义一个复杂类型shoetype:
<xs:complexType name="shoetype">
<xs:simpleContent>
<xs:extension base="xs:integer">
<xs:attribute name="country" type="xs:string" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
e) 带有混合内容的复合类型:可包含文本、属性、元素。
如一封信的格式如下:
<letter>
Dear Mr.<name>John Smith</name>.
Your order <orderid>1032</orderid>
will be shipped on <shipdate>2001-07-13</shipdate>.
</letter>
分析该封信,可知其中包含了多个元素:name、orderid和shipdate,且要求他们顺序出现,则可为letter定义lettertype:
<xs:complexType name="lettertype" 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>
七、 指示器:
a) Order指示器:用于定义元素的顺序,包含all,sequence和choice。
i. all指示器:子元素可以按照任意顺序出现,且每个子元素必须只出现一次。当使用all时,可将minOccurs置为0或1,但maxOccurs只能置为1!
ii. choice指示器:规定在子元素中选择一个出现,非此即彼。如需子元素可以出现任意次数,可通过maxOccurs来进行设置。
iii. sequence指示器:子元素必须按顺序出现。
b) Occurrence指示器:用于设置某个元素的出现频率。
i. minOccurs:最小出现次数,默认为1;
ii. maxOccurs:最大出现次数,unbounded表示出现次数不受限制。
如一个person必须有一个全名,可有0~5和孩子:
<xs:complexType>
<xs:sequence>
<xs:element name="full_name" type="xs:string"/>
<xs:element name="child_name" type="xs:string" minOccurs="0" maxOccurs="5"/>
</xs:sequence>
</xs:complexType>
c) Group指示器:用于定义成批的元素,内部必须定义好是all、choice还是sequence。
i. 元素组:通过group定义。
如将一个person的firstname,lastname和birthday打包为一个元素组persongroup:
<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>
则在复杂类型定义中可以通过ref来使用该组:
<xs:complexType name="personinfo">
<xs:sequence>
<xs:group ref="persongroup"/>
<xs:element name="country" type="xs:string"/>
</xs:sequence>
</xs:complexType>
ii. 属性组:通过attributeGroup定义。
如将一个person的firstname,lastname和birthday打包为一个属性组,可以通过类似的方式使用:
<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>
八、 Any元素:可以用来扩展xsd文档,将一个复杂类型中加入<xs:any minOccurs="0"/>,则可通过其他外部元素扩展原复杂类型。
注:可以通过在any/anyAttribute后跟namespace=”URI”来控制元素和属性的选取空间。
如一个person复杂类型元素:
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
<xs:any minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
可以在person中加入children元素来扩展,在使用中直接在person中加入child即可:
<person>
<firstname>David</firstname>
<lastname>Smith</lastname>
<children>
<childname>mike</childname>
</children>
</person>
九、 anyAttribute:有类似any的扩展功能,针对属性进行扩展。
如对于一个person的复杂类型元素,原有firstname和lastname两个元素,没有定义任何属性,通过加入<xs:anyAttribute/>可使person类型的属性在使用时进行扩展,如加入性别gender属性:
<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:anyAttribute/>
</xs:complexType>
</xs:element>
加入的gender属性:
<xs:attribute name="gender">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="male|female"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
实例:
<person gender="female">
<firstname>Jane</firstname>
<lastname>Smith</lastname>
</person>
十、 复合元素重用:除了上面介绍的通过元素组的方式可以实现重用,也可以直接通过ref进行引用。
<xs:element name="number" type="xs:integer"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="size" type="xs:nonNegativeInteger"/>
<xs:element name="color" type="ColorType"/>
<xs:complexType name="ProductType">
<xs:sequence>
<xs:element ref="number"/>
<xs:element ref="name"/>
<xs:element ref="size" minOccurs="0"/>
<xs:element ref="color" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
十一、 Import用法:???
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<import namespace="http://www.lotus.com/Schemas/products"
schemaLocation=" http://www.lotus.com/Schemas/products.xsd"/>
<xs:element name="number" type="xs:integer"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="size" type="xs:nonNegativeInteger"/>
<!--<xs:element name="color" type="ColorType"/>-->
<xs:complexType name="ProductType">
<xs:sequence>
<xs:element ref="number"/>
<xs:element ref="name"/>
<xs:element ref="size" minOccurs="0"/>
<!-- <xs:element ref="color" minOccurs="0"/>-->
</xs:sequence>
</xs:complexType>
</xs:schema>
十二、 elementFormDefault和attributeFormDefault:
unqualified:缺省;表明来自目标命名空间的元素不需要符合?命名空间前缀。(indicates that elements from the target namespace are not required to be qualified with the namespace prefix)
qualified:来自目标命名空间的元素必须要符合命名空间的前缀。
十三、 无论简单类型还是复杂类型,都可以被扩展:
简单类型通过extension扩展,复杂类型通过any和anyAttribute扩展。
例子一:一份订单shiporder如下
<?xml version="1.0" encoding="UTF-8"?>
<shiporder orderid="889923"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="shiporder.xsd">
<orderperson>George Bush</orderperson>
<shipto>
<name>John Adams</name>
<address>Oxford Street</address>
<city>London</city>
<country>UK</country>
</shipto>
<item>
<title>Empire Burlesque</title>
<note>Special Edition</note>
<quantity>1</quantity>
<price>10.90</price>
</item>
<item>
<title>Hide your heart</title>
<quantity>1</quantity>
<price>9.90</price>
</item>
</shiporder>
为其定义Schema如下:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="shiporder">
<xs:complexType>
<xs:sequence>
<xs:element ref="orderperson"/>
<xs:element ref="shipto" />
<xs:element ref="item" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="orderid" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="orderperson" type="xs:string"/>
<xs:element name="shipto">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="item">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string"/>
<xs:element name="note" type="xs:string" minOccurs="0"/>
<xs:element name="quantity" type="xs:positiveInteger"/>
<xs:element name="price" type="xs:decimal"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
例子2:使用XML文档记录学生信息,根元素为students,可以包含若干个student:
Student_name 文本,必须出现;
Student_sex 文本,只能取男或女;
Student_MobilePhone 文本,手机电话号码,格式为11位数字,可出现一次或不出现;
Grade 子元素,成绩,包含至多7个子元素class。每个class包含一个属性class_id(ID类型,一定要出现)一个子元素<result>(整数,取值0),<class>的定义在class.xsd中,在命名空间www.ecnu.edu.cn/student中。
class.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.ecnu.edu.cn/student"
elementFormDefault="qualified">
<xs:complexType name="class_type" mixed="true">
<xs:sequence>
<xs:element name="result">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="100"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
<xs:attribute name="class_id" type="xs:ID" use="required"/>
</xs:complexType>
</xs:schema>
student.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:student="http://www.ecnu.edu.cn/student">
<xs:import schemaLocation="class.xsd"
namespace="http://www.ecnu.edu.cn/student"/> #使用该路径下的class.xsd
<xs:simpleType name="sex_type">
<xs:restriction base="xs:string">
<xs:enumeration value="男"/>
<xs:enumeration value="女"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="mobile_number">
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]{11}"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="grade">
<xs:sequence>
<xs:element name="class" type="student:class_type" minOccurs="0" maxOccurs="7"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="student_type">
<xs:sequence>
<xs:element name="Student_name" type="xs:string" minOccurs="1"/>
<xs:element name="Student_sex" type="sex_type"/>
<xs:element name="Student_MobilePhone" type="mobile_number"/>
<xs:element name="Grade" type="grade"/>
</xs:sequence>
</xs:complexType>
</xs:schema>