微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

WebService(2)-XML系列之Schema

源码下载链接:http://pan.baidu.com/s/1o69nBzO 密码: bbw2

一.定义

Schema同样用于检测XML是否符合语法规则。

二.点评

相对DTD而言,有如下优点:

1.语法和Xml相同

2.数据类型很多

3.提供域名机制,就是Java中的包

三.Xml中引入Schema

两种方式:

1.通过“命名空间”来引入

xml_user_02path.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- xmlns:是schema的认命名空间,不能修改,但是可以增加前缀,如果增加前缀以后,则意味着创建所有element元素都需要增加前缀 -->
<!-- targetNamespace:自己这个文档的命名空间,可以方便其他xml或者schema文件引用 -->
<!-- xmlns:tns:此文件和自己的命名空间的名称是一致的,但是增加了tns的前缀,此时如果要引用当前文件所创建的类型,需要加上tns的前缀 -->
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
		targetNamespace="http://www.example.org/schema_user"
		xmlns:tns="http://www.example.org/schema_user" 
		elementFormDefault="qualified">
		<!-- complexType创建负责类型 -->
		<element name="user">
			<complexType>
				<!--sequence有顺序的 -->
				<sequence>
					<element name="id" type="int"></element>
					<element name="username" type="string"></element>
					<element name="borndate" type="date"></element>
				</sequence>		
			</complexType>
		</element>
		
</schema>


xml_user_01namespace.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 第一种方式:xml中引用schema,通过:命名空间的方式 -->
<!-- xmlns:xsi创建一个可以引用其它schema文件的命名空间 -->
<!--  xsi:schemaLocation 引入其它【schema_user】的命名空间-->
<user xmlns="http://www.example.org/schema_user"
	  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	  xsi:schemaLocation="http://www.example.org/schema_user">
	  <id>1</id>
	  <username>赵栗婧</username>
	  <borndate>2015-6-44</borndate>

</user>

2.通过xsd的文档路径来引入

xml_user_02path.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 第二种方式:xml中引用schema,通过:路径的方式 -->
<!-- xsi:noNamespaceSchemaLocation 中指定了需要引用的文件【schema_user.xsd】 -->
<user xmlns="http://www.example.org/schema_user" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="schema_user.xsd">
	<id>1</id>
	<username>赵栗婧</username>
	<borndate>2015-6-24</borndate>
</user>


四.Schema的设计方式

3种:

1.RussianDoll

【特点】只有一个根元素,通过嵌套的方式完成编写

【优点】结构清晰,根元素只有一个

【缺点】元素无法重用
schema_1books_RussianDoll.xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
	targetNamespace="http://www.example.org/schema_1books_RussianDoll" 
	xmlns:tns="http://www.example.org/schema_1books_RussianDoll" 
	elementFormDefault="qualified">
	<element name="books">
		<complexType>
			<!-- unbounded最大是没有限制的 -->
			<sequence maxOccurs="unbounded">
				<element name="book">
					<!-- 复杂类型 -->
					<complexType >
					<attribute name="id" type="int" use="required"></attribute>
						<!-- sequence设置是有序的;minOccurs最小是1;unbounded最大是没有限制的 -->
						<sequence minOccurs="1" maxOccurs="unbounded">
							<element name="bookid" type="int"></element>
							<element name="bookname" type="string"></element>
							<!-- 作者的人数是有选择的:1个或很多 -->
							<choice>
								<element name="auther" type="string"></element>
								<element name="authers" >
									<complexType>
										<!-- unbounded最大是没有限制的 -->
										<sequence maxOccurs="unbounded">
											<element name="auther" type="string"></element>
										</sequence>		
									</complexType>
								</element>
							</choice>
						</sequence>
						
					</complexType>
				</element>
			</sequence>
			
		</complexType>
	</element>
	
</schema>

xml_1books_RussianDoll.xml

<?xml version="1.0" encoding="UTF-8"?>
<book:books xmlns:book="http://www.example.org/schema_1books_RussianDoll"
	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	 xsi:noNamespaceSchemaLocation="schema_1books_RussianDoll.xsd">
	
	<book:book id="1">
		<book:bookid>1</book:bookid>
		<book:bookname>J2EE企业规范图书</book:bookname>
		<book:auther>赵栗婧</book:auther>
	</book:book>
	<book:book id="2"> 
		<book:bookid>2 </book:bookid>
		<book:bookname>J2EE企业规范图书</book:bookname>
		<book:authers>
			<book:auther>赵栗婧1</book:auther>
			<book:auther>赵栗婧2</book:auther>
		</book:authers>
	</book:book>
</book:books>


 2.Salami Slice

【特点】元素全部独立出来,后通过引用的方式进行引用

【优点】能够进行最大化重用

【缺点】根节点不清晰

schema_2books_SalamlSlice.xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
	targetNamespace="http://www.example.org/schema_2books_SalamlSlice" 
	xmlns:tns="http://www.example.org/schema_2books_SalamlSlice" 
	elementFormDefault="qualified">
	<element name="book" type="tns:bookType"></element>
	<element name="id" type="int"></element>
	<element name="name" type="string"></element>
	<element name="content" type="string"></element>
	<complexType name="bookType">
		<sequence maxOccurs="unbounded">
			<element ref="tns:id"></element>
			<element ref="tns:name"></element>
			<element ref="tns:content"></element>
		</sequence>
	</complexType>
</schema>


xml_2books_SalamlSlice.xml

<?xml version="1.0" encoding="UTF-8"?>
<bookType xmlns="http://www.example.org/schema_2books_SalamlSlice"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="schema_2books_SalamlSlice.xsd">
	<id>1</id>
	<name>1</name>
	<content>1</content>
</bookType>

3.CentianBind 推荐

【特点】只有一个根元素,但是通过s impleType完成引用

schema_3people_venetianbind.xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
	targetNamespace="http://www.example.org/schema_3people_venetianbind" 
	xmlns:tns="http://www.example.org/schema_3people_venetianbind" 
	elementFormDefault="qualified">
	<element name="people" type="tns:peopleType"></element>
	<complexType name="peopleType">
		<sequence>
			<element name="name" type="string"/>
			<element name="age" type="tns:ageType"/>			
			<element name="email" type="tns:emailType"/>			
		</sequence>
		<attribute name="sex" type="tns:sexType"/>
	</complexType>
	<!-- 年龄的类型:是int类型的,并且在:1-150岁之间 -->
	<simpleType name="ageType">
		<restriction base="int">
			<minInclusive value="1"/>
			<maxExclusive value="150"/>
		</restriction>
	</simpleType>
	<!-- 性别的类型:男/女 -->
	<simpleType name="sexType">
		<restriction base="string">
			<enumeration value="男"/>
			<enumeration value="女"/>
		</restriction>
	</simpleType>
	<!-- 邮件类型的限制 -->
	<simpleType name="emailType">
		<restriction base="string">
<!-- 			<pattern value="(\w+\.*)*\w+@\w+\.[A-Za-z](2,6)"/> -->
			<minLength value="2"/>
			<maxLength value="255"/>
		</restriction>
	</simpleType>
</schema>


xml_3people_venetianbind.xml

<?xml version="1.0" encoding="UTF-8"?>
<people xmlns="http://www.example.org/schema_3people_venetianbind"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="schema_3people_venetianbind.xsd"  sex="男">
	<name>赵栗婧</name>
	<age>20</age>
	<email>aaa</email>
</people>


五..Schema之间的引用

两种:

1.非包装方式

2.包装方式

schema_classroom.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
	targetNamespace="http://www.example.org/schema_classroom" 
	xmlns:tns="http://www.example.org/schema_classroom"
	elementFormDefault="qualified">
	<!-- 在classroom的schema中引入student的schema -->
	<xsd:include schemaLocation="schema_student.xsd"></xsd:include>
	<!-- 定义元素classroom,类型是classroomType -->
	<xsd:element name="classroom" type="tns:classroomType"></xsd:element>
	<!-- 定义复杂类型:classroomType -->
	<xsd:complexType name="classroomType">
		<xsd:sequence>
			<xsd:element name="name" type="xsd:string" />
			<xsd:element name="grade" type="tns:gradeType" />
			<!-- 开始:第一种:非包装的方式【建立classroom与student之间的关系】 -->
<!-- 			<xsd:element name="stus"> -->
<!-- 				<xsd:complexType> -->
<!-- 					<xsd:sequence minOccurs="1" maxOccurs="100"> -->
<!-- 						<xsd:element name="student" type="tns:studentType"></xsd:element> -->
<!-- 					</xsd:sequence> -->
<!-- 				</xsd:complexType> -->
<!-- 			</xsd:element> -->
			<!-- 结束:第一种:非包装的方式 -->
			<!--开始:第二种:包装的方式 -->
			<xsd:sequence minOccurs="1" maxOccurs="unbounded">
				<xsd:element name="student" type="tns:studentType"></xsd:element>
			</xsd:sequence>
			<!-- 结束:第二种:包装的方式 -->
		</xsd:sequence>
	</xsd:complexType>
	<xsd:simpleType name="gradeType">
		<xsd:restriction base="xsd:int">
			<xsd:minInclusive value="2000" />
			<xsd:maxExclusive value="3000" />
		</xsd:restriction>
	</xsd:simpleType>
</xsd:schema>


schema_student.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
	targetNamespace="http://www.example.org/schema_classroom"
	xmlns:tns="http://www.example.org/schema_classroom" 
	elementFormDefault="qualified">
	
	<xsd:element name="student" type="tns:studentType"/>
	
	<xsd:complexType name="studentType">
		<xsd:sequence>
			<xsd:element name="name" type="xsd:string"/>
			<xsd:element name="sex" type="tns:sexType"/>
		</xsd:sequence>
	</xsd:complexType>
	
	<xsd:simpleType name="sexType">
		<xsd:restriction base="xsd:string">
			<xsd:enumeration value="男"/>
			<xsd:enumeration value="女"/>
		</xsd:restriction>
		
	</xsd:simpleType>
</xsd:schema>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐