xml约束

来源:互联网 发布:用js设置秒表 编辑:程序博客网 时间:2024/06/06 03:36

什么是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文档中指定外部公共DTDXML文件使用 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所指定的名称空间

原创粉丝点击