[XML]学习笔记(六)——XML Schema复杂类型
来源:互联网 发布:在国外怎么淘宝 编辑:程序博客网 时间:2024/05/24 00:53
六、 复杂类型:
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>
0 0
- [XML]学习笔记(六)——XML Schema复杂类型
- 学习笔记——XML Schema复杂类型
- XML学习之Xml Schema:六、复杂类型--模型组
- [XML]学习笔记(五)——XML Schema简单类型元素与属性
- XML学习之Xml Schema:五、复杂类型--Attribute
- XML学习之Xml Schema:七、派生复杂类型--扩展
- XML学习之Xml Schema:八、派生复杂类型--限制
- XML学习之Xml Schema:九、派生复杂类型
- 学习笔记——XML Schema注释
- 学习笔记——XML Schema数据类型
- 学习笔记——XML Schema通配符
- Xml学习笔记:(一)schema元素类型
- 疯狂XML学习笔记(8)---------schema 的简单类型
- 疯狂XML学习笔记(9)-------------Schema内置类型
- 学习笔记——XML Schema自定义数据类型(续)
- XML schema学习笔记
- XML Schema学习笔记
- XML schema 学习笔记
- Log4J日志组件
- maven-settings.xml的那些事
- leancloud tools for sioeye testing
- 实现当UILable的内容超出其范围后自动滚动效果
- 第二次作业-hash
- [XML]学习笔记(六)——XML Schema复杂类型
- HTML常用标签整理
- Jquery之实现全选反选功能
- 删除11gR2 RAC
- 点圆柱的设计(1)
- 一起talk C栗子吧(第一百四十六回:C语言实例--socket属性)
- 求10个人的年龄的平均值 流程图
- ZOJ 3605 找大理石———————
- 如何在Windows 7系统下安装Ubuntu-Kylin 16.04 LTS 构成双系统