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

六、 复杂类型:
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>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值