Presentation is loading. Please wait.

Presentation is loading. Please wait.

第3章 文档类型定义DTD DTD与XML文档 定义元素及其后代 定义元素的属性.

Similar presentations


Presentation on theme: "第3章 文档类型定义DTD DTD与XML文档 定义元素及其后代 定义元素的属性."— Presentation transcript:

1 第3章 文档类型定义DTD DTD与XML文档 定义元素及其后代 定义元素的属性

2 1 DTD与XML文档(1) 为什么需要文档类型定义(DTD) ?
XML文档的基本要求是必须满足格式良好(Well Formed)的要求。格式良好的XML文档是非常简单的。如何根据需要对XML文档进行限制? 如何公布一个XML文档的结构? 如何重用XML文档的数据? 为了解决这些问题,就得需要DTD来解决。 什么是文档类型定义(DTD) ? DTD描述了一个标记语言的语法和词汇表,也就是定义了可以在XML文档中出现的元素、这些元素出现的次序、它们可以如何相互嵌套以及XML文档结构的其它详细信息。 DTD引入有效的XML文档 一个“有效的(Valid)” XML文档既是“格式良好”的,又必须遵守文档类型描述DTD中定义的种种规定。 DTD = Document Type Definition

3 1 DTD与XML文档(2) 内部DTD: 最简单的使用DTD的方法是在XML文档的内部分加入一个DTD描述。加入的位置是紧接在XML处理指示之后。 <?xml version = “1.0” encoding=“GB2312“ standalone=”yes”?> <!DOCTYPE 根元素名[     元素描述     ]> <根元素名> XML数据 </根元素名> 这样,我们就定义了一个文件,它以DOCTYPE中规定的根元素名作为其根元素的名字。 例3-1:内部DTD

4 1 DTD与XML文档(3) <?xml version = "1.0" encoding="GB2312"
standalone = "no"?> <!DOCTYPE 联系人列表[ <!ELEMENT 联系人列表 (联系人)*> <!ELEMENT 联系人 (姓名,ID,公司, ,电话,地址)> <!ELEMENT 地址 (街道,城市,省份)> <!ELEMENT 姓名 (#PCDATA)> <!ELEMENT ID (#PCDATA)> <!ELEMENT 公司 (#PCDATA)> <!ELEMENT (#PCDATA)> <!ELEMENT 电话 (#PCDATA)> <!ELEMENT 街道 (#PCDATA)> <!ELEMENT 城市 (#PCDATA)> <!ELEMENT 省份 (#PCDATA)> ]> <联系人列表> <联系人> <姓名>张三</姓名> <ID>001</ID> <公司>A公司</公司> <电话>(010) </电话> <地址> <街道>五街1234号</街道> <城市>北京市</城市> <省份>北京</省份> </地址> </联系人> <姓名>李四</姓名> <ID>002</ID> <公司>B公司</公司> <电话>(021) </电话> <街道>南京路9876号</街道> <城市>上海</城市> <省份>上海</省份> </联系人列表>

5 1 DTD与XML文档(4) 外部DTD: 将DTD置于XML文档之外的文件中。主要用于引用一个作者或组织所编写的众多XML文件中通用的DTD。 <?xml version="1.0“ encoding="GB2312" standalone="no"?> <!DOCTYPE 根元素名 SYSTEM "外部DTD文件的URL"> <根元素名> XML数据 </根元素名> 例3-2:外部DTD

6 1 DTD与XML文档(5) <!DOCTYPE 联系人列表 SYSTEM "fclml.dtd"> fclml.dtd:
<?xml version="1.0" encoding="GB2312"?> <!ELEMENT 联系人列表 (联系人)*> <!ELEMENT 联系人 (姓名,ID,公司, ,电话,地址)> <!ELEMENT 地址 (街道,城市,省份)> <!ELEMENT 姓名 (#PCDATA)> <!ELEMENT ID (#PCDATA)> <!ELEMENT 公司 (#PCDATA)> <!ELEMENT (#PCDATA)> <!ELEMENT 电话 (#PCDATA)> <!ELEMENT 街道 (#PCDATA)> <!ELEMENT 城市 (#PCDATA)> <!ELEMENT 省份 (#PCDATA)> <?xml version = "1.0" encoding="GB2312" standalone = "no"?> <!DOCTYPE 联系人列表 SYSTEM "fclml.dtd"> <联系人列表> <联系人> <姓名>张三</姓名> <ID>001</ID> <公司>A公司</公司> <电话>(010) </电话> <地址> <街道>五街1234号</街道> <城市>北京市</城市> <省份>北京</省份> </地址> </联系人> <姓名>李四</姓名> <ID>002</ID> <公司>B公司</公司> <电话>(021) </电话> <街道>南京路9876号</街道> <城市>上海</城市> <省份>上海</省份> </联系人列表>

7 1 DTD与XML文档(6) 公用DTD: 它是一个由权威机构制订的,提供给特定行业或公众使用的外部DTD。引用公共DTD的形式为:
<!DOCTYPE 根元素 PUBLIC “DTD标识名" "外部DTD的URL"> 例:<!DOCTYPE DOCUMENT PUBLIC “-//W3C//DTD HTML 4.0//EN” 这个“DTD标识名”的命名规则和XML文件的命名规则稍有不同。 ISO的以ISO开头,改进的非ISO以+开头,未改进的非ISO的以-开头。 后面由多个双斜线组成://所有者//类型描述//语言//版本。 例:“-//W3C//DTD HTML 4.0//EN”; “-//IETF//ENTITIES Latin 1//EN”; “-//W3C//DTD HTML//EN//4.1”

8 1 DTD与XML文档(7) IE XML TOOL是微软的IE插件,其功能是在IE中对XML文档进行有效性检查和浏览XSLT输出的代码。
从下面的网址下载 iexmltls.exe: 点击iexmltlx.exe解压到一个文件夹中 鼠标右键点击上述文件夹中的.inf的文件进行安装 使用iexmltls: 用IE打开XML文档 在打开的IE窗口上点击鼠标右键弹出下拉菜单 选择其中的 “Validate XML”

9 2 定义元素及其后代(1) 元素的声明: 元素声明不但说明了每个XML文件中可能存在的元素,给出了元素的名字,而且给出了元素的具体类型。一个XML元素可以为空,也可以是一段纯文本,还可以有若干个子元素,而这些子元素同时又可以有它们的子元素。DTD正是通过元素之间的父子关系,描述了整个文件的结构关系。 元素的声明形式为: <!ELEMENT 元素名 元素内容描述> 元素内容可分为如下的3个类型: 简单型:元素内容是可解析的字符数据(Parsed Character Data, PCDATA),即不含有子元素的文本。 复合型:元素的内容含有其它元素,既有子元素。 混合型:元素的内容既有文本数据又有子元素。

10 2 定义元素及其后代(2) 简单型元素的声明: <!ELEMENT 元素名 (#PCDATA)> 空元素的声明:
<!ELEMENT 元素名 EMPTY> 例如:     <!ELEMENT HR EMPTY> 不限定元素内容的声明: (不推荐使用) <!ELEMENT 元素名 ANY>

11 2 定义元素及其后代(3) 例: <?xml version = "1.0" encoding="GB2312" standalone = “yes"?> <!DOCTYPE 联系人 [ <!ELEMENT 联系人 ANY> <!ELEMENT 姓名 (#PCDATA)> <!ELEMENT ID (#PCDATA)> <!ELEMENT 公司 (#PCDATA)> <!ELEMENT 电话 (#PCDATA)> <!ELEMENT (#PCDATA)> ]> <联系人> <姓名>张三</姓名> <ID>001</ID> <公司>A公司</公司> <电话>(010) </电话> </联系人>

12 2 定义元素及其后代(4) 复合型元素的声明,即定义元素及其子元素:
DTD尽管要求严格,但也有它的灵活性。使用正则表达式,我们就可以描述父元素与子元素之间非常复杂的关系。下面就是描述子元素的正则式: 元 字 符 含    义 + 出现一次或多次 * 出现零次或多次 ? 不出现或出现一次 () 一组要共同匹配的表达式 | OR,或 AND,要求严格遵从顺序要求

13 2 定义元素及其后代(5) 要求顺序的子元素 DTD定义(,:有序) <!ELEMENT 联系人(姓名, EMAIL)>
<!ELEMENT 姓名(#PCDATA)> <!ELEMENT (#PCDATA)> 下面的XML片断是有效的: <联系人> <姓名>张三</姓名> </联系人> 而下面这个XML片断不是有效的: <联系人> <姓名>张三</姓名> </联系人>

14 2 定义元素及其后代(6) 重复元素 DTD定义(+:至少出现一次) <!ELEMENT 联系人(姓名,EMAIL+)>
<!ELEMENT 姓名(#PCDATA)> <!ELEMENT (#PCDATA)> 下面的XML片断是有效的: <联系人>     <姓名>张三</姓名>             </联系人> 而下面这个XML片断不是有效的: <联系人> <姓名>张三</姓名> </联系人>

15 2 定义元素及其后代(7) DTD定义(*:出现任意次)
<!ELEMENT 联系人(姓名, *)> <!ELEMENT 姓名(#PCDATA)> <!ELEMENT (#PCDATA)> 成组元素:一组元素放在括号内 DTD定义(元素组) <!ELEMENT 联系人 (姓名, )+> <!ELEMENT 姓名 (#PCDATA)> <!ELEMENT (#PCDATA)> 符合这个DTD的XML片断可以是: <联系人>     <姓名>张三</姓名>         <姓名>李四</姓名>         <姓名>王五</姓名>     </联系人>

16 2 定义元素及其后代(8) OR或:符号“|”描述了一个OR操作。
<!ELEMENT 联系人 (姓名,(电话| ))> <!ELEMENT 姓名 (#PCDATA)> <!ELEMENT 电话 (#PCDATA)> <!ELEMENT (#PCDATA)> “联系人”元素应该有一个“姓名”子元素,在此之后还应该有一个“电话”或一个“ ”元素,但不能同时有“电话”和“ ”。 下面都是无效的XML片段 <联系人>     <姓名>张三</姓名> </联系人> <联系人>     <姓名>张三</姓名>     <电话> </电话>     </联系人> <联系人>         <姓名>张三</姓名> </联系人>

17 2 定义元素及其后代(9) 符合上述DTD定义的有效的XML片段应该是:
<联系人>     <姓名>张三</姓名>     <电话> </电话> </联系人> 或者是: <联系人>     <姓名>张三</姓名>     </联系人> 注意:在一个组中,只允许使用一种连接符(例如“,”或“|”)。 下面这样定义的DTD是不合法的: <!ELEMENT 联系人(姓名,电话| )>

18 2 定义元素及其后代(10) 可选子元素:字符“?”说明一个子元素是可选的,可出现,也可不出现。
    <!ELEMENT 联系人 (姓名,(电话| ),地址?)> <!ELEMENT 姓名 (#PCDATA)> <!ELEMENT 电话 (#PCDATA)> <!ELEMENT (#PCDATA)> <!ELEMENT 地址 (街道,城市,省份)> <!ELEMENT 街道 (#PCDATA)> <!ELEMENT 城市 (#PCDATA)> <!ELEMENT 省份 (#PCDATA)> 下面的XML片段是“有效的”: <联系人>     <姓名>张三</姓名>        <地址>         <街道>五街1234号</街道>         <城市>北京市</城市>         <省份>北京</省份>     </地址> </联系人> <联系人>     <姓名>张三</姓名>     </联系人>

19 2 定义元素及其后代(11) 混合内容: <!ELEMENT 元素名 (#PCDATA|子元素1|子元素2…)*>
   在一个元素中可能包含子元素,也可能包含纯文本。把这种元素称为混合内容的元素。在下面的例子中,“联系人”就是一个混合元素。(不推荐使用) <?xml version = "1.0" encoding="GB2312" standalone = "yes"?> <!DOCTYPE 联系人列表 [     <!ELEMENT 联系人列表 ANY>        <!ELEMENT 联系人 (#PCDATA|姓名|电话| )*>     <!ELEMENT 姓名 (#PCDATA)>     <!ELEMENT 电话 (#PCDATA)>     <!ELEMENT (#PCDATA)>     ]> <联系人列表> <联系人>         <姓名>张三</姓名>         <电话>(010) </电话>                 这是关于张三的信息        </联系人> </联系人列表>

20 3 定义元素的属性(1) 在DTD中定义属性时,使用下面的格式: <!ATTLIST 元素名 (属性名 属性类型 缺省值)*>
其中: 元素名是属性所属的元素的名字; 属性名是属性的命名; 属性类型是用来指定该属性是属于十个有效属性类型中的哪种类型。 缺省值是在没有特别说明属性时的取值,可定义也可不定义; 注意:ATTLIST是一个属性的列表,它可以包含很多属性的定义。 例: <!ATTLIST 商品     类型 CDATA #REQUIRED     颜色 CDATA #IMPLIED > <商品 类型 = “服装” 颜色 = "黄色">

21 3 定义元素的属性(2) 属性缺省值 在DTD中定义的属性的缺省值可以分为以下四类:
必须赋值的属性 关键字REQUIRED说明XML文件中必须为这个属性给出一个属性值。 属性值可有可无的属性 当使用IMPLIED关键字时,不强行要求在XML文件中给该属性赋值,也无须在DTD中为该属性提供缺省值。 固定取值的属性 还有一种特殊情况,你需要为一个特定的属性提供一个缺省值,并且不希望XML文件的编写者把你的缺省值替代掉。这时候,就应该使用FIXED关键字,同时为该属性提供一个缺省值。 定义缺省值的属性 如果不使用上面任何一种关键字的话,就需要在DTD中为它提供一个缺省值。在XML文件中可以为该属性给出新的属性值来覆盖事先定义的缺省值,也可以不另外给出属性值,默认为采用DTD中给出的缺省值。

22 3 定义元素的属性(3) 下面给出一个具体的例子:
<!ATTLIST 页面作者         姓名 CDATA #IMPLIED         年龄 CDATA #IMPLIED         联系信息 CDATA #REQUIRED         网站职务 CDATA #FIXED "页面作者"         个人爱好 CDATA "上网"> 属性类型 一个元素的属性可以为以下八种类型中的任意一种: 1.CDATA 6.ENTITY 2.Enumerated 7.NMTOKEN 3.ID 8.NMTOKENS 4.IDREF 5.IDREFS

23 3 定义元素的属性(4) CDATA类型    CDATA指的是纯文本,即由字符、符号“&”、小于号“<”和引号“””组成的字符串。当然,应该使用实体&代替“&”,<代替“<”,&quot代替“””。 请看下面这个关于剧本的例子: <?xml version = "1.0" encoding="GB2312"       standalone = "yes"?> <!DOCTYPE 剧本 [     <!ELEMENT 剧本 ANY>     <!ELEMENT 对话 (#PCDATA)>     <!ATTLIST 对话 演员 CDATA #REQUIRED>     ]> <剧本>     <对话 演员="某甲">我可不这么认为!</对话>     <对话 演员="某乙">为什么呢?</对话> </剧本>

24 3 定义元素的属性(5) 枚举类型ENUMERATED    属性也可以被描述为一组可接受的取值的列表,XML文件中对属性的赋值将从这个列表中选取一个值。这类属性属于枚举类型ENUMERATED,不过,关键字ENUMERATED是不出现在DTD定义中的。 例:<?xml version = “1.0” encoding=“GB2312”       standalone = “yes”?> <!DOCTYPE 购物篮 [     <!ELEMENT 购物篮 ANY>     <!ELEMENT 肉 EMPTY>     <!ATTLIST 肉 种类 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) “鸡肉”>     ]> <购物篮>     <肉 种类= “鱼肉”/>     <肉 种类= "牛肉"/>     <肉/> </购物篮> 注意,在上面这个例子中,给属性“种类”定义的缺省值是“鸡肉”,所以“购物篮”中的第三个元素的“种类”属性取值为“鸡肉”。

25 3 定义元素的属性(6) ID类型 ID是用属性值的方式为文件中的某个元素定义唯一标识的方法。ID的值必须是一个有效的XML名称,不要给ID类型的属性事先指定缺省值,更不能使用FIXED型的缺省值。 <?xml version = "1.0" encoding="GB2312" standalone = "yes"?> <!DOCTYPE 联系人列表[     <!ELEMENT 联系人列表 ANY>     <!ELEMENT 联系人(姓名, )>     <!ELEMENT 姓名(#PCDATA)>     <!ELEMENT (#PCDATA)>     <!ATTLIST 联系人 编号 ID #REQUIRED>     ]> <联系人列表>     <联系人 编号=“a1">         <姓名>张三</姓名>             </联系人>     <联系人 编号=“a2">         <姓名>李四</姓名>             </联系人> </联系人列表>

26 3 定义元素的属性(7) IDREF类型 IDREF类型允许一个元素的属性使用文件中的另一个元素的ID标识值作为该属性的取值。例如下面的例子: <?xml version = "1.0" encoding="GB2312" standalone = "yes"?> <!DOCTYPE 联系人列表[     <!ELEMENT 联系人列表 ANY>     <!ELEMENT 联系人(姓名, )>     <!ELEMENT 姓名(#PCDATA)>     <!ELEMENT (#PCDATA)>     <!ATTLIST 联系人 编号 ID #REQUIRED>     <!ATTLIST 联系人 上司 IDREF #IMPLIED>     ]> <联系人列表>     <联系人 编号=“a2">         <姓名>张三</姓名>             </联系人>     <联系人 编号=“a1" 上司=“a2">         <姓名>李四</姓名>              </联系人> </联系人列表>

27 3 定义元素的属性(8) NMTOKEN 和 NMTOKENS:名称记号
类型 NMTOKEN 和 NMTOKENS 是诸多属性类型中面向处理程序的又一个类型。这两个类型用于指示一个有效的XML名称。例如可以通过NMTOKEN 类型的属性来访问一个JAVA类等等。 关于元素的定义: <!ELEMENT 数据(#PCDATA)> <!ATTLIST 数据     安全性 ( ON | OFF ) "OFF">     授权用户 NMTOKENS #IMPLIED > XML片段: <数据 安全性="ON" 授权用户="IggieeB SelenaS GuntherB"> blah blah blah </数据>

28 4 实体(1) 实体(ENTITY):是XML中用来指代其它复杂结构的机制。一个简单的实体可以代表一大段文本内容。
实体可分为内部实体和外部实体。 实体声明: 内部实体:<!ENTITY 实体名 “文本内容”> 外部实体:<!ENTITY 实体名 SYSTEM “URI”> 实体引用:&实体名; 其实像”&gt;”、”&lt;”等特殊实体就是一种内部预定义的实体.

29 4 实体(2):内部实体 <?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE 联系人列表 [ <!ELEMENT 联系人列表 (联系人*)> <!ELEMENT 联系人 (姓名, 公司, 地址)> <!ELEMENT 姓名 (#PCDATA)> <!ELEMENT 公司 (#PCDATA)> <!ELEMENT 地址 (#PCDATA)> <!ENTITY A公司地址 "北京市五街1234号"> <!ENTITY B公司地址 "上海南京路9876号"> ]> <联系人列表> <联系人> <姓名>张三</姓名> <公司>A公司</公司> <地址>&A公司地址;</地址> </联系人> <姓名>李四</姓名> <公司>B公司</公司> <地址>&B公司地址;</地址> <姓名>王五</姓名> </联系人列表>

30 4 实体(3):外部实体 Fclml.dtd: <?xml version="1.0" encoding="GB2312"?>
<!DOCTYPE 联系人列表 SYSTEM "FCLML.DTD"> <联系人列表> <联系人> <姓名>张三</姓名> <公司>A公司</公司> <地址>&A公司地址;</地址> </联系人> <姓名>李四</姓名> <公司>B公司</公司> <地址>&B公司地址;</地址> <姓名>王五</姓名> </联系人列表> Fclml.dtd: <?xml version="1.0" encoding="GB2312"?> <!ELEMENT 联系人列表 (联系人*)> <!ELEMENT 联系人 (姓名,公司,地址)> <!ELEMENT 地址 (#PCDATA)> <!ELEMENT 姓名 (#PCDATA)> <!ELEMENT 公司 (#PCDATA)> <!ENTITY A公司地址 SYSTEM "北京市五街1234号"> <!ENTITY B公司地址 SYSTEM "上海南京路9876号"> 查看实例

31 5 DTD中声明的类型小结 DTD格式: <!DOCTYPE 根元素名[ 元素描述 ]> 元素声明:
<!ELEMENT 元素名 元素内容> 属性声明: <!ATTLIST 元素名 属性名 类型 缺省值> 属性类型: 1.CDATA 6.ENTITY 2.Enumerated 7. NMTOKEN 3.ID NMTOKENS 4.IDREF 5.IDREFS


Download ppt "第3章 文档类型定义DTD DTD与XML文档 定义元素及其后代 定义元素的属性."

Similar presentations


Ads by Google