xml约束

本文详细介绍了XML文档中的约束机制,包括DTD和Schema两种类型。解释了如何使用DTD定义XML文档结构,如元素、属性及其实现细节。同时对比了XML Schema与DTD的不同之处,展示了XML Schema的语法和使用方法。

什么是xml约束

因为xml文档是可以自定义元素的,这会让使用xml文档的应用程序无法知道xml文档的真实结构。通常应用程序都会要求xml文件的结构是固定的,以满足自己的需求,这就说明,不同的应用程序要求自己的xml文档必须符合一定的要求。
XML文档约束的类型
xml文档约束有两种类型:dtd和schema

dtd:dtd是平面式文档,dtd文件不是xml文档,通常扩展名为“.dtd”。它是最早的xml约束;
schema:schema本身也是xml文档,它比dtd要更加强大,通常扩展名为“.xsd”。它是新的xml文档约束,用来替代dtd。
DTD是老的XML约束,Schema是新的,用Schema替换掉DTD

DTD:
DTD(Document Type Definition),文档类型定义,用来约束XML文档。例如要求xml文档的根元素必须是,在元素下可以包含0~n个元素,每个元素

必须有一个number属性,而且还要有三个子元素,分别为、、,这三个子元素的内容必须为文本内容,而不能是子元素。

DTD展示:

<!ELEMENT students (student+)>
<!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
解读上面DTD:
students元素中可以包含1~n个student元素;
student元素中必须包含name、age、sex元素,而且顺序也是固定的;
name元素内容为文本,即字符串;
age元素内容为文本;
sex元素内容为文本。

2、在XML文档中指定本地DTD

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE students SYSTEM "students.dtd">
<students>
    <student>
        <name>zhangSan</name>
        <age>23</age>
        <sex>male</sex>
    </student>
</students>
在XML文档中指定内部DTD
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE students [
<!ELEMENT students (student+)>
<!ELEMENT student (name, age, sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
]>
<students>
    <student>
        <name>zhangSan</name>
        <age>23</age>
        <sex>male</sex>
    </student>
</students>
解读上面DTD:
students元素中可以包含1~n个student元素;
student元素中必须包含name、age、sex元素,而且顺序也是固定的;
name元素内容为文本,即字符串;
age元素内容为文本;
sex元素内容为文本

在XML文档中指定外部公共DTD
XML文件使用 DOCTYPE 声明语句来指明它所遵循的DTD文件,DOCTYPE声明语句有两种形式
当引用的文件在本地时,采用如下方式:
		<!DOCTYPE 文档根结点 SYSTEM "DTD文件的URL">
	例如: <!DOCTYPE 书架 SYSTEM “book.dtd”>。在xml文件中手写一下。
当引用的文件是一个公共的文件时,采用如下方式:	
		<!DOCTYPE 文档根结点 PUBLIC "DTD名称" "DTD文件的URL">

DTD定义元素:
定义元素的语法
使用ELEMENT声明元素:<!ELEMENT 元素名 内容类型或内容> 
例如:<!ELEMENT name (#PCDATA)> 
表示name元素的内容为文本数据

1、用|分隔,表示任选其一,即多个只能出现一个
<!ELEMENT MYFILE (TITLE|AUTHOR|EMAIL)>
2、用逗号分隔,表示内容的出现顺序必须与声明时一致。
<!ELEMENT MYFILE (TITLE,AUTHOR,EMAIL)>
3、也可使用圆括号( )批量设置,例
<!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>

2、元素类型
元素类型可以是ANY或EMPTY
<!ELEMENT stu ANY>:表示stu元素的内容可以是任意元素,也可以是文本数据,也可以是文本数据+子元素,反正就是任意。
<!ELEMENT stu EMPTY>:表示stu不能有任何内容,即空元素。例如:。
3、元素内容
元素内容可以是文本数据,也可以是子元素 
<!ELEMENT stu (#PCDATA)>表示stu元素内容为文本,例如:<stu>hello</stu> 
4、子元素出现次数
可以使用“?”、“*”、“+”来指定子元素的出现次数 
+: 一次或多次 (书+)
?: 0次或一次 (书?)
*: 0次或多次  (书*)
<!ELEMENT stu (name?)>表示stu元素可以有0~1个name子元素,即name子元素可有可无。 
<!ELEMENT stu(name*)>表示stu元素可以有0~n个name子元素; 
<!ELEMENT stu(name+)>表示stu元素可以有1~n个name子元素。
5、多个子元素
<!ELEMENT stu (name,age,sex)>表示stu必须有三个子元素,分别是name、age、sex,并且子元素出现的顺序也要与声明的顺序一致。
6、枚举子元素
<!ELEMENT stu (name | age | sex)表示stu只有一个子元素,可以是name、age、sex中的任意一个。
7、复合声明1
<!ELEMENT stu (name | age | sex)?>表示stu元素可以有0~1个(name | age | sex),而(name | age | sex)表示name、age、sex其中的一个。
<stu></stu>
<stu><name/></stu>
<stu><age/></stu>
<stu><sex/></stu>
8、复合声明2
<!ELEMENT stu (name | age | sex)*>表示stu元素可以有0~n个(name | age | sex),而(name | age | sex)表示name、age、sex其中的一个。
<stu></stu>
<stu><name/><name/></stu>
<stu><name/><age/><age/></stu>
<stu><name/><age/><name/><sex/><sex/></stu>
9、复合声明3
<!ELEMENT stu (name | age | sex)+>表示stu元素可以有1~n个(name | age | sex),而(name | age | sex)表示name、age、sex其中的一个。
<stu><age/></stu>
<stu><name/><name/></stu>
<stu><name/><age/><age/></stu>
<stu><name/><age/><name/><sex/><sex/></stu>

10、练习

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE 课件 [
<!ELEMENT 章节 (简介, (标题, (段落 | 图片 | 表格 | 说明)+)+)>
<!ELEMENT 简介 (#PCDATA)>
<!ELEMENT 标题 (#PCDATA)>
<!ELEMENT 段落 (#PCDATA)>
<!ELEMENT 图片 (#PCDATA)>
<!ELEMENT 表格 (#PCDATA)>
<!ELEMENT 说明 (#PCDATA)>
<!ELEMENT 课件 (章节+)>]>
<课件>
    <章节>
        <简介>简介</简介>
          <标题>标题</标题>
          <段落>段落</段落>
          <段落>段落</段落>
          <段落>段落</段落>
          
          <标题>标题</标题>
          <段落>段落</段落>
          <段落>段落</段落>
          <段落>段落</段落>
    </章节>
</课件>
xml文档中的标签属性需通过ATTLIST为其设置属性
语法格式:
<!ATTLIST 元素名 
属性名1 属性值类型 设置说明
属性名2 属性值类型 设置说明
……
>
属性声明举例:
<!ATTLIST 商品
类别 CDATA #REQUIRED
颜色 CDATA #IMPLIED
>
对应XML文件:
<商品 类别="服装" 颜色="黄色">…</商品> 
<商品 类别="服装">…</商品> 

设置说明:
最常见的属性类型:CDATA,表示文本类型;
#REQUIRED:必须设置该属性
#IMPLIED:可以设置也可以不设置 
#FIXED:说明该属性的取值固定为一个值,在 XML 文件中不能为该属性设置其它值。但需要为该属性提供这个值 
直接使用默认值:在 XML 中可以设置该值也可以不设置该属性值。若没设置则使用默认值。  


举例:
      <!ATTLIST 页面作者 
	     姓名 CDATA #IMPLIED 
	     年龄 CDATA #IMPLIED 
	     联系信息 CDATA #REQUIRED 
	     网站职务 CDATA #FIXED "页面作者" 
	     个人爱好 CDATA "上网"
       >


属性类型:
CDATA:属性值为任意文本数据;
Enumerated:属性值必须是枚举列表中的一个;
ID:属性值必须是唯一的,并且属性值不能以数字开头;
ENTITY(实体)
Enumerated不是关键字,定义枚举类型的属性需要给出枚举列表。当属性值为枚举类型时,那么这个属性的取值必须是枚举列表中的一个值。
属性的类型可以是一组取值的列表,在 XML 文件中设置的属性值只能是这个列表中的某个值(枚举)
<?xml version = "1.0" encoding="GB2312" standalone="yes"?>
<!DOCTYPE 购物篮 [
	<!ELEMENT 肉 EMPTY>
	<!ATTLIST 肉 品种 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉">
]> 
<购物篮>
	<肉 品种="鱼肉"/>
	<肉 品种="牛肉"/>
	<肉/>
</购物篮>
CDATA属性类型:
CDATA,即Character Data(字符数据)。表示属性的类型为字符类型! 
<!ATTLIST student number CDATA #REQUIRED>表示student元素的number属性是字符数据类型,并且是必须属性。 
<student number=”czbk_1001”>
ID属性类型:
一个元素最多只能有一个ID 属性,ID属性用来表示元素唯一性的唯一标识。ID属性就相当与元素的身份证号,必须是唯一标识! 
ID 属性的值只能由字母,下划线开始,不能出现空白字符    注意:不能以数字开头。
如果<a>元素有一个ID属性a 
如果<b>元素有一个ID属性b
<a a=”abc”/>
<b b=”abc”/>
上面也是错误的,因为ID属性的值是不可以相同的。

<?xml version = "1.0" encoding="GB2312" ?>
<!DOCTYPE 联系人列表[
	<!ELEMENT 联系人列表 ANY>
	<!ELEMENT 联系人(姓名,EMAIL)>
	<!ELEMENT 姓名(#PCDATA)>
	<!ELEMENT EMAIL(#PCDATA)>
	<!ATTLIST 联系人 编号 ID #REQUIRED>
]>
<联系人列表>
	<联系人 编号="1">
		<姓名>张三</姓名>
		<EMAIL>zhang@it315.org</EMAIL>
     </联系人>
	<联系人 编号="2">
		<姓名>李四</姓名>
		<EMAIL>li@it315.org</EMAIL>
	</联系人>
</联系人列表>

XML Schema 也是一种用于定义和描述 XML 文档结构与内容的模式语言,其出现是为了克服 DTD 的局限性
XML Schema VS DTD:
XML Schema符合XML语法结构。 
DOM、SAX等XML API很容易解析出XML Schema文档中的内容。 
XML Schema对名称空间支持得非常好。 
XML Schema比XML DTD支持更多的数据类型,并支持用户自定义新的数据类型。 
XML Schema定义约束的能力非常强大,可以对XML实例文档作出细致的语义限制。
XML Schema 文件自身就是一个XML文件,但它的扩展名通常为.xsd。
XML Schema不能像DTD一样定义实体,比DTD更复杂,但Xml Schema现在已是w3c组织的标准,它正逐步取代DTD。

XML Schema 文件自身就是一个XML文件,但它的扩展名通常为.xsd。
一个XML Schema文档通常称之为模式文档(约束文档),遵循这个文档书写的xml文件称之为实例文档。
和XML文件一样,一个XML Schema文档也必须有一个根结点,但这个根结点的名称为Schema。
编写了一个XML Schema约束文档后,通常需要把这个文件中声明的元素绑定到一个URI地址上,在XML Schema技术中有一个专业术语来描述这个过
程,即把XML Schema文档声明的元素绑定到一个名称空间上,以后XML文件就可以通过这个URI(即名称空间)来告诉解析引擎,xml文档中编写的元
素来自哪里,被谁约束。

<?xml version="1.0" encoding="UTF-8" ?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
					  targetNamespace="http://www. itcast.cn"
					  elementFormDefault="qualified">
	<xs:element name='书架' >
		<xs:complexType>
			<xs:sequence maxOccurs='unbounded' >
				<xs:element name='书' >
					<xs:complexType>
						<xs:sequence>
							<xs:element name='书名' type='xs:string' />
							<xs:element name='作者' type='xs:string' />
							<xs:element name='售价' type='xs:string' />
						</xs:sequence>
					</xs:complexType>
				</xs:element>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
</xs:schema>



<?xml version="1.0" encoding="UTF-8"?>

<itcast:书架 xmlns:itcast="http://www.itcast.cn"
				xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
				xsi:schemaLocation="http://www.itcast.cn book.xsd">

	<itcast:书>
		<itcast:书名>JavaScript网页开发</itcast:书名>
		<itcast:作者>张孝祥</itcast:作者>
		<itcast:售价>28.00元</itcast:售价>
	</itcast:书>
</itcast:书架>

为了在一个XML文档中声明它所遵循的Schema文件的具体位置,通常需要在Xml文档中的根结点中使用schemaLocation属性来指定,例如:
	<itcast:书架 xmlns:itcast="http://www.itcast.cn"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xsi:schemaLocation=“http://www.itcast.cn book.xsd">
schemaLocation此属性有两个值。第一个值是需要使用的命名空间。第二个值是供命名空间使用的 XML schema 的位置,两者之间用空格分隔。
注意,在使用schemaLocation属性时,也需要指定该属性来自哪里

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
		       targetNamespace="http://www. itcast.cn"
		       elementFormDefault="qualified">
<xs:schema>
targetNamespace元素用于指定schema文档中声明的元素属于哪个名称空间。
elementFormDefault元素用于指定,该schema文档中声明的根元素及其所有子元素都属于targetNamespace所指定的名称空间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值