340 likes | 499 Views
第 3 章 XML 文档类型定义 ---- DTD. 目标. 理解文档类型定义 DTD 声明 元素声明 属性声明 实体声明. XML 确认 ---- 确保 XML 文档中数据的一致性. 符合语法的 XML 文档称为结构良好的 XML 文档。 通过 DTD 验证的 XML 文档称为有效的 XML 文档。. 3.1 DTD 概述. 文档类型定义 --Document Type Definition DTD 用来描述 XML 文档的结构, DTD 定义了 XML 文档中可用的合法元素。
E N D
目标 • 理解文档类型定义 • DTD声明 • 元素声明 • 属性声明 • 实体声明
XML 确认----确保XML文档中数据的一致性 • 符合语法的XML文档称为结构良好的XML文档。 • 通过DTD验证的XML文档称为有效的XML文档。
3.1 DTD概述 • 文档类型定义--Document Type Definition • DTD用来描述XML文档的结构, DTD定义了XML文档中可用的合法元素。 • 用DTD 指定:可以在文档中存在的元素、元素可以具有的属性、在元素内部元素的层次结构以及元素在整个文档中出现的顺序。
3.2 DTD声明 • DTD可以是一个完全独立的文件,也可以在XML文件中直接设定。 • DTD分为外部DTD(在XML文件中调用另外已经编辑好的DTD)和内部DTD(在XML文件中直接设定DTD)两种。
3.2.1 内部DTD • 内部DTD是在XML文件的文件序言区域中定义的。 内部DTD的XML文档的结构为: < ?xml version = "1.0" ?>< !DOCTYPE 根元素名[ 元素描述 ]> 文档数据区.......
3.2.1 内部DTD(续) <?xml version='1.0' encoding='gb2312'?> <!DOCTYPE poem[ <----------------根元素的名称 <!ELEMENT poem (author,title,content) > <-----------子元素的名称及顺序 <!ELEMENT author (#PCDATA)> <------------------子元素的数据类型 <!ELEMENT title (#PCDATA)> <!ELEMENT content (#PCDATA)> ]> <------------------------结束标签 <poem> <author>王维</author> <title>鹿柴</title> <content>空山不见人,但闻人语声. 返景入深林,复照青苔上. </content> </poem> 内部DTD示例 注意:例中的定义关键字一定要大写,如DOCTYPE、ELEMENT、#PCDATA,且元素名称与数据类型之间也要有空格。
3.2.2 外部DTD • 外部DTD是一个独立于XML文件的文件,实际上也是一个文本文件,只是使用.dtd为文件扩展名。 • 外部DTD的好处是:它可以方便高效地被多个XML文档所共享。 • 外部DTD的创建方式、语法和内部DTD是一样的。
3.2.2 外部DTD (续2-1) • 使用外部DTD的XML文档的结构为: < ?xml version = "1.0"?> < !DOCTYPE 根元素名SYSTEM/ PUBLIC "外部DTD文件名及其位置"> 文档数据区.......
3.2.2 外部DTD (续2-2) <? xml version='1.0' encoding='gb2312' ?> <!DOCTYPE poem SYSTEM "ex2.dtd"> <poem> <author>王维</author> <title>鹿柴</title> <content>空山不见人,但闻人语声.返景入深林,复照青苔上.</content> </poem> 外部DTD使用示例 <?xml version="1.0" encoding="gb2312"?> <!ELEMENT poem (author,title,content)> <!ELEMENT author (#PCDATA)> <!ELEMENT title (#PCDATA)> <!ELEMENT content (#PCDATA)>
3.3 DTD语法 • 一个DTD文档包含 • 元素(ELEMENT)的定义规则 • 元素之间的关系规则 • 属性(ATTLIST)的定义规则 • 可使用的实体(ENTITY)或符号(NOTATION)规则
3.3.1元素声明——确定元素及其类型 • 元素有三种不同的类型 • 数据型(即字符内容) • <Text>Hello</Text> • 元素型(即包含的内容是元素) • <Letter> • <sub>QUIT</sub> • <Body>Hello everybody!</Body> • </Letter> • 混合型(包含的内容既有元素又有内容) • <para> • Hello everybody • <bold>quit</bold> • </para>
3.3.1元素声明——元素的定义(1/5) • 语法 <!ELEMENTNAMECONTENT> 关键字 元素名称 元素类型 EMPTY-该元素不能包含子元素和文本,但可以有属性-(空元素) ANY-该元素可以包含任何在DTD中定义的元素内容 #PCDATA-可以包含任何字符数据,但是不能在其中包含任何子元素 PCDATA代表字符数据,为防止与关键字混淆,加#前缀 纯元素类型--只包含子元素,并且这些子元素外没有文本 混合类型--包含子元素和文本数据的混合体
3.3.1元素声明——元素的定义(2/5) • EMPTY示例--空元素 <!ELEMENT人 EMPTY> XML示例: <家庭> <人 名字="皮诺曹" 性别="男" 年龄="6"/> </家庭> <家庭> <人>皮诺曹</人> <人><大人>皮诺曹爸爸</大人></人> </家庭> √ ×
3.3.1元素声明——元素的定义(3/5) • ANY示例 <!ELEMENT人 ANY> XML示例: <家庭> <人>皮诺曹</人> <人><大人>皮诺曹爸爸</大人></人> </家庭> • 将根元素设为ANY类型后,元素出现的次数和顺序不受限制。
3.3.1元素声明——元素的定义(4/5) • #PCDATA示例 <!ELEMENT人 (#PCDATA)> <家庭> <人 性别="男" 年龄="6">皮诺曹</人> </家庭> <家庭> <人><大人>皮诺曹爸爸</大人></人> </家庭> √ XML 示 例: ×
3.3.1元素声明——元素的定义(5/5) • 组合类型示例 <!ELEMENT家庭 (人+, 家电*)> XML示例: <家庭> <人 名字="郭大路" 性别="男" 年龄="25"/> <人 名字="李寻欢" 性别="男" 年龄="38" 爱好="作个教育家和伟人"/> <家电 名称="彩电" 数量="3"/> </家庭>
注意1: • 在元素设置中,如果元素包含多个子元素,如:〈!ELEMENT 书籍(名称,作者,价格)〉这种含多个子元素的声明,那么“名称”、“作者”、“价格”这些标记在XML文件中必须以上面排列的顺序出现,每个标记必须而且只能够出现一次。
注意2: • 如果在设定元素时,按照〈!ELEMENT 书籍ANY〉,这样在元素下就可以包含任意被设定过的元素,出现的次数和顺序也不受限制,并且在该元素下,除了可以包含子元素以外,还能够包含一般的文字。
注意3: • 在XML文件中,一个标记可能多次出现(或者不出现),除了在它们的父元素中用ANY关键字之外,还可以在元素的旁边加上特定的符号来控制标记出现的次数。
3.3.2属性声明 在DTD中定义属性时,我们使用下面的格式来给一个元素定义一组合适的属性,同时指定这些属性的类型和缺省值: <!ATTLIST 元素名(属性名 值类型 [属性类型] [“缺省值“])> 其中: • 元素名是属性所属的元素的名字。 • 属性名是属性的命名。 • 值类型是给属性分配的值。 • 缺省值是属性的初值。
属性的定义 • 语法 <!ATTLIST元素名称 属性名称 类型 属性特点 …... > CDATAIDIDREF/IDREFSNMTOKEN/NMTOKENSEnumerated #REQUIRED#IMPLIED#FIXED valueDefault value
属性类型- CDATA • 属性值可以是任何字符(包括数字和中文) <!ATTLIST 木偶 姓名 CDATA #REQUIRED> XML示例: <木偶 姓名="皮诺曹"/><木偶 姓名="Pi Luocao"/><木偶 姓名="123"/>
属性类型-NMTOKEN/NMTOKENS • NMTOKEN是CDATA 的一个子集,表示属性值必须是英文字母、数字、句号、破折号、下划线或冒号(不能是中文!)。 • NMTOKENS与NMTOKEN类似,包含多个由空格分隔的字符。 XML示例: <?xml version="1.0" encoding="gb2312" ?> <!DOCTYPE poems[ <!ELEMENT poems (title,content)> <!ELEMENT title (#PCDATA)> <!ATTLIST title author NMTOKEN #REQUIRED> <!ELEMENT content (#PCDATA)> ]> <poems> <title author="杜甫">八阵图</title> <content> 功盖三分国,名成八阵图, 江流石不转,遗恨失吞吴. </content> </poems> <?xml version="1.0" encoding="gb2312" ?> <!DOCTYPE poems[ <!ELEMENT poems (title,content)> <!ELEMENT title (#PCDATA)> <!ATTLIST title author NMTOKEN #REQUIRED> <!ELEMENT content (#PCDATA)> ]> <poems> <title author="dupu">八阵图</title> <content> 功盖三分国,名成八阵图, 江流石不转,遗恨失吞吴. </content> </poems> × √
属性类型- ID • 表明该属性的取值必须是唯一的。该ID必须以一个字母开头 <!ELEMENT 公司职员 ANY><!ATTLIST 公司职员 编号 ID #REQUIRED姓名 CDATA #REQUIRED> ID属性值必须是合格的XML名字 XML示例: <公司职员 编号="Z001" 姓名="张三"/> <公司职员 编号="Z002" 姓名="李四"/> √ <公司职员 编号="Z001" 姓名="张三"/> <公司职员 编号="Z001" 姓名="李四"/> ×
属性类型- IDREF/IDREFS • IDREF属性的值指向文档中其它地方声明的ID类型的值。 • IDREFS同IDREF,但是可以具有由空格分开的多个引用。 <!ELEMENT 家庭 (人+)><!ELEMENT 人 EMPTY><!ATTLIST 人relID ID #REQUIRED parentID IDREFS #IMPLIED name CDATA #REQUIRED> <家庭> <人 relID="P_1" name="爸爸"/> <人 relID="P_2" name="妈妈"/> <人 relID="P_3" parentID="P_1 P_2" name="儿子"></家庭> 空格 XML示例
属性类型-Enumerated • 事先定义好一些值,属性的值必须在所列出的值的范围内。 <!ATTLIST person 婚姻状态 (single|married|divorced|widowed) #IMPLIED> <!ATTLIST persion 性别 (男|女) #REQUIRED>
属性的特点-#REQUIRED • 元素的所有实例都必须有该属性的值(NOT NULL) • 语法: <!ATTLIST 元素名 属性名 属性类型#REQUIRED> • DTD 示例: <!ATTLIST person number CDATA #REQUIRED> • XML 示例: <person number="5677" />
属性的特点-#IMPLIED • 元素的实例中可以忽略该属性(NULL)。 • 语法: <!ATTLIST 元素名 属性名属性类型#IMPLIED> • DTD示例: <!ATTLIST contact fax CDATA #IMPLIED> • XML示例: <contact fax="555-667788" />
属性的特点-#FIXED value • 元素实例中该属性的值必须为指定的固定值。在元素中不能够设定该属性,因为这个属性被设为具有固定值的属性(#FIX关键字) • 语法: <!ATTLIST 元素名 属性名 类型#FIXED "value"> • DTD示例: <!ATTLIST sender company CDATA #FIXED "Microsoft"> • XML示例: <sender company="Microsoft" />
属性的特点-Default value • 为属性提供一个默认的值 • 语法: <!ATTLIST 元素名 属性名 类型"value"> • DTD示例: <!ATTLIST payment type CDATA "check"> • XML示例: <payment type="check" />
定义实体-内部实体 • 作用:避免重复输入 - (宏、变量) • XML中五个预定义实体 • 自定义实体语法: <!DOCTYPE 根元素 [ <!ENTITY 实体名"实体内容"> ]> • 引用已定义的实体: &实体名;
3.4 本章小结 • 在本章中,我们学习了如何使用DTD来描述文档结构,包括文档包含的必需元素、属性和任选元素、属性,以及元素间的相关关系和自定义实体。特别学习了以下内容: • 文档类型定义(DTD)提供了XML文档所包含的元素、属性和实体及相互关系的定义。 • 内部DTD和外部DTD • 元素类型声明:声明元素名称和子元素。 • 如何在DTD中声明元素的属性 • 如何从内部和外部实体开始创建XML文档