关于xml学习(二)——xml的约束之Schema

前端之家收集整理的这篇文章主要介绍了关于xml学习(二)——xml的约束之Schema前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。


XML Schema 文件自身就是一个XML文件,但它的扩展名通常为.xsd,和XML文件一样,一个XML Schema文档也必须有一个根结点,但这个根元素的名称为Schema。

XML Schema是用一套预先规定的XML元素和属性创建的,这些元素和属性定义了XML文档的结构和内容模式。 XML Schema规定XML文档实例的结构和每个元素/属性的数据类型。


Schema命名空间:

命名空间的使用在XML中主要有两个目的:
1.用于区分那些名称相同但来自不同schema库,具有不同含义的元素和属性。通过将元素、属性与URL相关联,命名空间能够区分具有相同名称的元素
2.在一个单一的XML应用中,将相关的元素和属性组合起来,使它们可以很容易地被软件包识别,名称空间用一个唯一的URI表示,仅起到唯一标识的作用。
分类
默认命名空间声明:不带前缀 ,默认命名空间只能有一个
•格式:xmlns=“url”
•例如:xmlns="http://www.w3.org/2001/XMLSchema"
显式命名空间声明:声明时指定前缀
•格式:xmlns: quoteName =“url”
•例如: xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

一些概念:
一个XML Schema文档通常称之为模式文档(约束文档),遵循这个文档书写的xml文件称之为实例文档。并且根元素schema节点必须来自http://www.w3.org/2001/XMLSchema 命名空间,官方建议使用使用前缀 xs ,及xmlns:xs。Schema相对于DTD的明显好处是,XML Schema文档本身也是XML文档,而不是像DTD一样使用自成一体的语法。

Schema文档中出现的元素标记



Schema实例:

1)定义一个简单元素:

2)定义含有子元素的元素(子元素有顺序):

3)定义含有子元素的元素(子元素没有顺序):


4)定义含有子元素的元素(任选一个):


5)仅含有属性的空元素 && 仅含有属性的空元素,属性必须写:


6)必须含有属性的非空元素:

7)必须含有属性也包含子元素的元素:

8)元素内容必须在2——5之间的数:


9)包含多个指定元素:


10)将身份证号格式化,自定义类型:



综上所述之后,可以参考下列代码,加深印象:

代码1:

books.xml:

<?xml version="1.0" encoding="UTF-8"?>
<books  xmlns="http://www.example.org/books"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.example.org/books books.xsd"
>
	<!--
		在文档关联中,如何确定文件的位置
	    	* 官方规定,* http://www.w3.org/2001/XMLSchema-instance
	    		* 将当前的xml文档实例化
	    	* schemaLocation属性(两个参数空格隔开)
	    		* 第一参数:实例化所需要的schema文档的名称
	    		* 第二参数:schema文档的相对路径URI
	-->

	<!-- schema引用流程
		1.新建schema文件,确定schema名字,即命名空间
		2.创建自己的根节点
		3.在web project/WebRoot/WEB-INF/web.xml拷贝内容
		4.修改根元素、修改命名空间、修改schema位置
	 -->
</books>
books.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
	targetNamespace="http://www.example.org/books" 
	xmlns:tns="http://www.example.org/books" 
	elementFormDefault="qualified"
	attributeFormDefault="qualified">
	
	<!-- 
		1、当前的文档books.xsd是schema文档
		2、targetNamespace
			* 为当前的schema文档命名,为自己取一个名字
			* 属性值:自定义
				* 要求:必须全球唯一
				* 一般采用URL,域名
					* 例如:www.itcast.cn
					      http://www.example.org/books
			* 命名空间Namespace
		3、xmlns  --》  xml namespace
			* 声明引入指定名称的命名空间,引用已有的命名空间,默认的
			* 作用:使用指定命名空间已定义好的所有内容
			* 例如:http://www.w3.org/2001/XMLSchema w3c起的名
				* 官方为自己的schema文档起的名称
			* 格式:xmlns:别名
				* xmlns:xs
				* 使用:xs:schema,从当前别名xs所代表的schema文档中定义了schema元素
			* 格式2:xmlns(默认命名空间引用)
			* 好处:防止命名冲突
	 -->
	 
	 <!-- 
	 	elementFormDefault: 一个实例文档中被局部声明的元素是否必须被目标命名空间(targetNamespace)所规范 
				qualified:任何xml实例文档必须声明其在schema文档中使用的每一个命名空间 
				unqualified:在XML实例文档“隐藏”该命名空间,因此在实例文档中仅需对目标命名空间进行命名空间声明 
				
		attributeFormDefault: 元素用于指定局部属性是否受到该schema指定targetNamespace所指定的名称空间限定
	  -->
	 
	 <!-- 定义根元素 element -->
	 <xs:element name="books"></xs:element>
</xs:schema>

代码2:

books2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<books xmlns="http://www.example.org/books2"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.example.org/books2 books2.xsd"
>

	<ele></ele>
	
	<person>
		<name></name>
		<age></age>
	</person>
	
	<user>
		<age></age>
	</user>
	
	<worker>
		<age></age>
		<name></name>
	</worker>
	
	<price unit="¥">1234</price>

</books>
books2.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
	targetNamespace="http://www.example.org/books2" 
	xmlns:tns="http://www.example.org/books2" 
	elementFormDefault="qualified">
	
	<!-- 定义根元素 element -->
	<element name="books">
		<complexType>
			<sequence>
			
			
				<!-- 1、定义元素
					<ele></ele>
				 -->
				<element name="ele"></element>
				
				<!-- 2、定义元素包含子元素 ** 顺序 ** dtd,<person>
						<name></name>
						<age></age>
					</person>
					* 当前子元素的类型 
						* 复合类型 complexType
						* 简单类型simpleType
					* 子元素的顺序
				 -->
				<element name="person">
					<complexType>  <!-- 符合类型 -->
						<sequence> <!-- 顺序,内部包含的子元素 -->
							<element name="name"></element>
							<element name="age"></element>
						</sequence>
					</complexType>
				</element>
				
				<!-- 3、定义元素包含子元素 ** 选择 ** dtd |
					<user>
						<name></name>
						<age></age>
					</user>
					* 当前子元素的类型 
						* 符合类型 complexType
						* 简单类型simpleType
					* 子元素的顺序
				 --> 
				 <element name="user">
				 	<complexType>
				 		<choice><!-- 选择 -->
				 			<element name="name"></element>
							<element name="age"></element>
				 		</choice>
				 	</complexType>
				 </element>
				 
				 <!-- 4、定义元素包含子元素 ** 没顺序 ** dtd |
					<worker>
						<name></name>
						<age></age>
					</worker>
					* 当前子元素的类型 
						* 符合类型 complexType
						* 简单类型simpleType
					* 子元素的顺序
				 -->
				<element name="worker">
					<complexType>
						<all>
							<element name="name"></element>
							<element name="age"></element>
						
						</all>
					</complexType>
				</element>
				
				<!-- 
					5、包含属性,有内容的元素
					<price unit="¥">34</price>
				 -->
				<element name="price">
					<complexType>
						<simpleContent> <!-- 简单内容 -->
							<!-- 扩展,将简单的内容扩展成复杂的类型
								base:确定简单内容的类型
							 -->
							<extension base="integer"> 
								<!-- 定义属性 
									name:确定名称
									type:确定类型
									use:
										* optional 可选
										* required 必须
										* prohibited 禁用
								-->
								<attribute name="unit" type="string" use="required"> 
								</attribute>
							</extension>
						</simpleContent>
					</complexType>
				</element>
			
			
			</sequence>
		</complexType>
	</element>
</schema>

代码3:

books3.xml:

<?xml version="1.0" encoding="UTF-8"?>
<books unit="abc" xmlns="http://www.example.org/books3"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.example.org/books3 books3.xsd"
>123</books>
books3.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
	targetNamespace="http://www.example.org/books3" 
	xmlns:tns="http://www.example.org/books3" 
	elementFormDefault="qualified">
	
	<!-- 
		默认官方xmlns="http://www.w3.org/2001/XMLSchema" 
		使用自定愿意类型,需要引入自定声明的schema文档的名称
	 -->

	<!-- 确定根元素 -->
	<element name="books" type="tns:myType">
	</element>
	
	<!-- 声明类型  自定义类型
		name:定义名称
	 -->
	<complexType name="myType">
		<simpleContent> <!-- 简单内容 -->
			<extension base="integer"> 
				<attribute name="unit" type="string" use="required"></attribute>
			</extension>
		</simpleContent>
	</complexType>

</schema>

补充:


XML Schema基础概念:

简易元素:仅包含文本的元素。它不会包含任何其他的元素或属性

复合元素:包含其他元素及/或属性的 XML 元素
•空元素
•包含其他元素的元素
•仅包含文本的元素
•包含元素和文本的元素

预定义类型:


属性相关定义:

attribute元素的use属性来定义是否是必须的属性
required是必须值
optional是可选值
prohibited是无属性
缺省值如何定义:<attributename="quantity"type="integer"default="1"/>
固定值如何定义:<attribute name= "name" fixed= "张三"></attribute>

关于元素和属性出现次数的约束:

猜你在找的XML相关文章