1、 1 DTD与XML文档(1)为什么需要文档类型定义(DTD)?XML文档的基本要求是必须满足格式良好(Well Formed)的要求。格式良好的XML文档是非常简单的。如何根据需要对XML文档进行限制?如何公布一个XML文档的结构?如何重用XML文档的数据?为了解决这些问题,就得需要DTD来解决。什么是文档类型定义(DTD)?DTD描述了一个标记语言的语法和词汇表,也就是定义了可以在XML文档中出现的元素、这些元素出现的次序、它们可以如何相互嵌套以及XML文档结构的其它详细信息。DTD引入有效的XML文档一个“有效的(Valid)”XML文档既是“格式良好”的,又必须遵守文档类型描述DTD中
2、定义的种种规定。DTD=Document Type Definition1 DTD与XML文档(2)内部DTD:最简单的使用DTD的方法是在XML文档的内部分加入一个DTD描述。加入的位置是紧接在XML处理指示之后。XML数据这样,我们就定义了一个文件,它以DOCTYPE中规定的根元素名作为其根元素的名字。例3-1:内部DTD1 DTD与XML文档(3)?xml version=1.0 encoding=GB2312 standalone=no?!DOCTYPE!DOCTYPE 联系人列表联系人列表 !ELEMENT !ELEMENT )!ELEMENT )!ELEMENT (#PCDATA)
3、!ELEMENT (#PCDATA)!ELEMENT (#PCDATA)!ELEMENT (#PCDATA)!ELEMENT (#PCDATA)!ELEMENT (#PCDATA)张三张三/001 001 AA公司公司/ (010)62345678(010)62345678 五街五街12341234号号/北京市北京市/北京北京/李四李四/002 002 BB公司公司/libbb.org libbb.org (021)87654321(021)87654321 南京路南京路98769876号号/上海上海/上海上海/1 DTD与XML文档(4)外部DTD:将DTD置于XML文档之外的文件中。主要用
4、于引用一个作者或组织所编写的众多XML文件中通用的DTD。XML数据例3-2:外部DTD1 DTD与XML文档(5)!DOCTYPE 张三张三/001 001 AA公司公司/ (010)62345678(010)62345678 五街五街12341234号号/北京市北京市/北京北京/李四李四/002 002 BB公司公司/libbb.org libbb.org (021)87654321(021)87654321 南京路南京路98769876号号/上海上海/上海上海/fclml.dtd:!ELEMENT !ELEMENT)!ELEMENT)!ELEMENT(#PCDATA)!ELEMENT(#
5、PCDATA)!ELEMENT(#PCDATA)!ELEMENT(#PCDATA)!ELEMENT(#PCDATA)!ELEMENT(#PCDATA)1 DTD与XML文档(6)公用DTD:它是一个由权威机构制订的,提供给特定行业或公众使用的外部DTD。引用公共DTD的形式为:例:这个“DTD标识名”的命名规则和XML文件的命名规则稍有不同。ISO的以ISO开头,改进的非ISO以+开头,未改进的非ISO的以-开头。后面由多个双斜线组成:/所有者/类型描述/语言/版本。例:“-/W3C/DTD HTML 4.0/EN”;“-/IETF/ENTITIES Latin 1/EN”;“-/W3C/DT
6、D HTML/EN/4.1”1 DTD与XML文档(7)IE XML TOOL是微软的IE插件,其功能是在IE中对XML文档进行有效性检查和浏览XSLT输出的代码。从下面的网址下载 iexmltls.exe:http:/ 点击iexmltlx.exe解压到一个文件夹中 鼠标右键点击上述文件夹中的.inf的文件进行安装 使用iexmltls:用IE打开XML文档 在打开的IE窗口上点击鼠标右键弹出下拉菜单 选择其中的“Validate XML”2 定义元素及其后代(1)元素的声明:元素的声明:元素声明不但说明了每个元素声明不但说明了每个XML文件中可能存在的元素,给出了元文件中可能存在的元素,给
7、出了元素的名字,而且给出了元素的具体类型。一个素的名字,而且给出了元素的具体类型。一个XML元素可以为空,元素可以为空,也可以是一段纯文本,还可以有若干个子元素,而这些子元素同时也可以是一段纯文本,还可以有若干个子元素,而这些子元素同时又可以有它们的子元素。又可以有它们的子元素。DTD正是通过元素之间的父子关系,描正是通过元素之间的父子关系,描述了整个文件的结构关系。述了整个文件的结构关系。元素的声明形式为:元素的声明形式为:元素内容可分为如下的元素内容可分为如下的3个类型:个类型:l简单型简单型:元素内容是可解析的字符数据(:元素内容是可解析的字符数据(Parsed Character Da
8、ta,PCDATA),即不含有子元素的文本。),即不含有子元素的文本。l复合型复合型:元素的内容含有其它元素,既有子元素。:元素的内容含有其它元素,既有子元素。l混合型混合型:元素的内容既有文本数据又有子元素。:元素的内容既有文本数据又有子元素。2 定义元素及其后代(2)简单型元素的声明:简单型元素的声明:空元素的声明:空元素的声明:例如:例如:不限定元素内容的声明:不限定元素内容的声明:(不推荐使用)2 定义元素及其后代(3)例例:!DOCTYPE 联系人联系人 张三张三 001 A公司公司 (010)62345678 2 定义元素及其后代(4)复合型元素的声明,即定义元素及其子元素:DTD
9、尽管要求严格,但也有它的灵活性。使用正则表达式,我们就可以描述父元素与子元素之间非常复杂的关系。下面就是描述子元素的正则式:元 字 符含 义+出现一次或多次*出现零次或多次?不出现或出现一次()一组要共同匹配的表达式|OR,或,AND,要求严格遵从顺序要求2 定义元素及其后代(5)要求顺序的子元素DTD定义(,:有序)下面的XML片断是有效的:张三而下面这个XML片断不是不是有效的:张三2 定义元素及其后代(6)重复元素 DTD定义(+:至少出现一次)下面的XML片断是有效的:张三 而下面这个XML片断不是不是有效的:张三2 定义元素及其后代(7)DTD定义(*:出现任意次)成组元素:一组元素
10、放在括号内DTD定义(元素组)符合这个DTD的XML片断可以是:张三 李四 libbb.org 王五 wangccc.org 2 定义元素及其后代(8)OR或:符号“|”描述了一个OR操作。“联系人”元素应该有一个“姓名”子元素,在此之后还应该有一个“电话”或一个“EMAIL”元素,但不能同时有“电话”和“EMAIL”。下面都是无效无效的XML片段 张三 张三 12345678 张三2 定义元素及其后代(9)符合上述DTD定义的有效的XML片段应该是:张三 12345678或者是:张三 注意:在一个组中,只允许使用一种连接符(例如“,”或“|”)。下面这样定义的DTD是不合法不合法的:2 定义
11、元素及其后代(10)可选子元素:字符“?”说明一个子元素是可选的,可出现,也可不出现。下面的XML片段是“有效的”:张三 五街1234号 北京市 北京 张三 2 定义元素及其后代(11)混合内容:在一个元素中可能包含子元素,也可能包含纯文本。把这种元素称为混合内容的元素。在下面的例子中,“联系人”就是一个混合元素。(不推荐使用)!DOCTYPE 联系人列表 张三 (010)62345678 这是关于张三的信息 3 定义元素的属性(1)在DTD中定义属性时,使用下面的格式:其中:元素名是属性所属的元素的名字;属性名是属性的命名;属性类型是用来指定该属性是属于十个有效属性类型中的哪种类型。缺省值是
12、在没有特别说明属性时的取值,可定义也可不定义;注意:注意:ATTLIST是一个属性的列表,它可以包含很多属性的定义。例:3 定义元素的属性(2)属性缺省值属性缺省值 在DTD中定义的属性的缺省值可以分为以下四类:必须赋值的属性必须赋值的属性关键字REQUIRED说明XML文件中必须为这个属性给出一个属性值。属性值可有可无的属性属性值可有可无的属性当使用IMPLIED关键字时,不强行要求在XML文件中给该属性赋值,也无须在DTD中为该属性提供缺省值。固定取值的属性固定取值的属性还有一种特殊情况,你需要为一个特定的属性提供一个缺省值,并且不希望XML文件的编写者把你的缺省值替代掉。这时候,就应该使
13、用FIXED关键字,同时为该属性提供一个缺省值。定义缺省值的属性定义缺省值的属性如果不使用上面任何一种关键字的话,就需要在DTD中为它提供一个缺省值。在XML文件中可以为该属性给出新的属性值来覆盖事先定义的缺省值,也可以不另外给出属性值,默认为采用DTD中给出的缺省值。3 定义元素的属性(3)下面给出一个具体的例子:属性类型一个元素的属性可以为以下八种类型中的任意一种:1.CDATA 6.ENTITY2.Enumerated 7.NMTOKEN3.ID 8.NMTOKENS4.IDREF 5.IDREFS 3 定义元素的属性(4)CDATA类型 CDATA指的是纯文本,即由字符、符号“&”、小
14、于号“”和引号“”组成的字符串。当然,应该使用实体&代替“&”,<代替“”,"代替“”。请看下面这个关于剧本的例子:!DOCTYPE 剧本 我可不这么认为!为什么呢?3 定义元素的属性(5)枚举类型ENUMERATED 属性也可以被描述为一组可接受的取值的列表,XML文件中对属性的赋值将从这个列表中选取一个值。这类属性属于枚举类型ENUMERATED,不过,关键字ENUMERATED是不出现在DTD定义中的。例:!DOCTYPE 购物篮 注意,在上面这个例子中,给属性“种类”定义的缺省值是“鸡肉”,所以“购物篮”中的第三个元素的“种类”属性取值为“鸡肉”。3 定义元素的属
15、性(6)ID类型类型 ID是用属性值的方式为文件中的某个元素定义唯一标识的方法。ID的值必须是一个有效的XML名称,不要给ID类型的属性事先指定缺省值,更不能使用FIXED型的缺省值。!DOCTYPE 联系人列表 张三 李四 libbb.org 3 定义元素的属性(7)IDREF类型类型 IDREF类型允许一个元素的属性使用文件中的另一个元素的ID标识值作为该属性的取值。例如下面的例子:!DOCTYPE 联系人列表 张三 李四 3 定义元素的属性(8)NMTOKEN 和 NMTOKENS:名称记号 类型 NMTOKEN 和 NMTOKENS 是诸多属性类型中面向处理程序的又一个类型。这两个类型
16、用于指示一个有效的XML名称。例如可以通过NMTOKEN 类型的属性来访问一个JAVA类等等。关于元素的定义:授权用户 NMTOKENS#IMPLIEDXML片段:blah blah blah4 实体(1)l实体(ENTITY):是XML中用来指代其它复杂结构的机制。一个简单的实体可以代表一大段文本内容。l实体可分为内部实体和外部实体。l实体声明:内部实体:外部实体:l实体引用:&实体名;l其实像”>;”、”<;”等特殊实体就是一种内部预定义的实体.4 实体(2):内部实体!DOCTYPE 联系人列表 张三A公司&A公司地址;李四B公司&B公司地址;王五B公司&B公司地址;4 实体(3):外部实体 张三A公司&A公司地址;李四B公司&B公司地址;王五B公司&B公司地址;Fclml.dtd:查看实例查看实例5 DTD中声明的类型小结DTD格式:元素声明:属性声明:属性类型:1.CDATA 6.ENTITY2.Enumerated 7.NMTOKEN3.ID 8.NMTOKENS4.IDREF 5.IDREFS