[XML]学习笔记(六)——XML Schema复杂类型

来源:互联网 发布:在国外怎么淘宝 编辑:程序博客网 时间:2024/05/24 00:53
六、 复杂类型:
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
原创粉丝点击