1、1第一章 XML 与 DTDXML 的产生: XML 的全称是 Extensible Markup Language,意思是可扩展的标记语言,它是标准通用标记语言(Standard Generalized Markup Language,SGML)的一个子集。在 80 年代早期,IBM 提出在各文档之间共享一些相似的属性例如字体大小和版面。IBM 设计了一种文档系统,通过在文档中添加标记,来标识文档中的各种元素,IBM把这种标识语言称作通用标记语言(Generalized Markup Language) ,即 GML。经过若干年的发展,1984 年国际标准化组织(ISO )开始对此提案进行讨
2、论,并于 1986 年正式发布了为生成标准化文档而定义的标记语言标准(ISO 8879),称为新的语言SGML,即标准通用标记语言。SGML 功能非常强大,是可以定义标记语言的元语言。W3C 介绍:W3C 是万维网联盟(World Wide Web Consortium)英文的缩写,它成立于 1994 年 10 月,以开放论坛的方式来促进开发互通技术(包括规格、指南、软件和工具) ,开发网络的全部潜能。万维网联盟(W3C)从 1994 年成立以来,已发布了 90 多份 Web 技术规范,领导着Web 技术向前发展。W3C 认为自身不是官方组织,因此将它正式发布的规范称为推荐(建议)标准,意思是
3、进一步标准化的建议,但是由于该组织自身的权威性往往成为事实上的标准。一项技术要成为 W3C 的推荐标准,需要 7 个步骤:1W3C 收到提交(Receives a Submission) 2.W3C 发布注释 (Publishes a Note) 3.W3C 成立工作组(Creates a Working Group) 4.W3C 发布工作草案(Publishes a Working Draft) 5.W3C 发布候选推荐标准(Publishes a Candidate Recommendation) 6.W3C 发布提议的推荐标准(Publishes 2a Proposed Recommen
4、dation) 7.W3C 发布推荐标准(Publishes a Recommendation)关于 XML 的问题:XML 是 HTML 的扩展吗?HTML 的全称是 Hypertext Markup Language(超文本标记语言) ,而 XML 的全称是(Extensible Markup Language)可扩展的标记语言,这很容易让人联想到 XML 是通过增加新标记来扩展 HTML 的一种标记语言。实际上 HTML 和 XML 在标记语言中处于不同的层次。这是一个欢迎的例子 这是一个欢迎的例子你好!欢迎你!你好! 欢迎你! 提示:XML 在设计之初,就考虑到了国际化的问题,同 HT
5、ML4.01 一样,XML 也是基于 ISO/IEC 10646 字符集标准中定义的通用字符集(Universal Character Set.UCS)。SGML、HTML 和 XML 之间的关系:SGML、HTML 和 XML 之间是什么关系?SGML 是一种在 Web 发明前就早已存在的使用标记来描述文档资料的通用语言,它是一种定义标记语言的元语言。HTML 和 XML 都是从 SGML 发展而来的标记语言,因此,它们有一些共同点,如相似的语法和标记的使用。不过 HTML 是在 SGML 定义下的一个描述性的语言,只是 SGML 的一个应用,其 DTD 作为标准被固定下来,而 XML 是S
6、GML 的一个简化版本,是 SGML 的一个子集,严格意义上来说,XML 仍然是SGML。HTML 不能用来定义新的应用,而 XML 可以,例如 RDF 和 CDF 那是使用 XML定义的应用事实上。XML 和 SGML 是兼容的但又没有 SGML 那么复杂,它是设计用于有限带宽的网络,如 Internet. XML 规范的制定者之一 Tim Bray 说,XML 的设计出发点是取 SGML 的优点,去除复杂的部分,使其保持轻巧,可以在 Web 上工作。HTML、SGML 和 XML 将继续使用于适合的地方,它们中的任何一个都不会使其它一个废弃。对于像新闻、网络日记、论坛留言等大部分短期的数据
7、,HTML 仍是在 Web 上快速出版数据的最简单的方法。如果数据要长期使用,并且需要更多的一些结构,我们更推荐使用 XML。不同于 HTML 和 XML,SGML 可能永远不会在 Internet 上被广泛接受,因为它们不是为某个网络协议而设计,也从来没有为某个网络协议的需求而优化过。对于高端的、复杂结构的出版应用,SGML 将继续应用。XML 与 HTML 的比较:XML 将数据与显示分开静夜思 静夜思静夜思 李白作者:李白 床前明月光疑是地上霜床前明月先,疑是地上霜 举头望明月3举头望明月,低头思故乡 低头思故乡 XML 对文档的格式要求更加严格 ,由于 HTML 文档格式非常松散,导致
8、了 HTML 文档解析的复杂性,也造成了浏览器兼容的问题,所以 XML 从一开始,就对文档的格式制定了非常严格的标准,凡是符合这一标准的 XML 文档就是格式良好的 XML 文档(Well-Formed XML Documents) 。开始标签必须要有一个结束标签:在 HTML 文档中,可以直接使用, ,等标签,而不用加结束标签,在 XML 中,开始标签和结束标签必须配套,也就是必须写成.、., . 空元素标签必须被关闭 .在 HTML 文档中,可以使用, ,等单标签,而在 XML 中,空元素标签必须被关闭。空元素标签采用斜杠(/)来关闭,例如:,所有的标签都区分大小写在 HTML 文档中,标
9、签是不区分大小写的, 和是 tr 元素的开始标签和结束标签,但是在 XML 中,和 是两个不同的标签,开始标签和结束标签的大小写形式必须一致.所有的标签都必须合理嵌套。在 HTML 文档中,.是允许的,但是在 XML 中,这是错误的在 XML 中,所有的标签都要成对出现,合理嵌套,正确的形式是:. 所有标签的属性值必须用双引号(“)或单引号()括起来。在 HTML 文档中,属性值可以加引号,也可以不加,例如:和都是合法的。在 XML 文档中,即使是数等字符,也必须加双引号或单引号,例如:。XML 有且只能有一个根元素 ,在 HTML 中,可以有多个根元素,如下: . . 但是在 XML 中,有
10、且只能有一个根元素,如下:.XML 的编辑工具:Notepad(Windows 自带) 、UltraEdit、XMLSpyXML 的文档: 每一个 XML 文档都有一个逻辑和一个物理结构。物理上而言,文档由称为实体(entities)的存储单元组成,实体都具有内容并且都通过实体的名字进行标识文档实体和外部 DTD 子集除外) 。实体可以是一段文本、一个文件、一个数据库记录或其他包含数据的项目。一个实体可以引用其它的实体,从而将它们包含在文档中。文档开始于“根(root)“或文档实体(document entity).格式良好的 XML 文档形成了一种层次树结构,而这个树的树根就是文档实体,与其
11、它实体不同,文档实体没有名宇,只是用于表示文档树的根。XML 文档的根元素被称为文档元素(document element),它和在其外部出现的处理指令、注释等作为文档实体的子节点,而根元素本身和其内部的子元素也是一棵树. 实体可以包含已分析(parsed)的或未分析的(unparsed)数据.已分析的数据由字符组成,其中一些字符组成字符数据,另一些字符组成标记。已分析的实体(parsed entity)内容被称为它的替换文本,这个文本被看成是文档整体的一部分在 XML 处理器分析 XML文档时,凡是文档中出现引用已分析实体的地方,都将被该实体的内容所替换.未分析的实体(unparsed en
12、tity) 是一种资源,它的内容可以是也可以不是文本,并且,如果是文本的话,可以不是 XML 文本。每一个未分析的实体有一个相关联的用名字标识的记号(notation)。除了要求 XML 处理器能向应用程序提供可用的实体和记号的标识符之外,XML 对未分析的实体内容不作任何限限制。已分析的实体以实体引用的方式通过名字来调用:未分析的实体通过 ENTITY 或 ENTITIES 属性中给出的名字来调用逻辑上而言,文档由声明,元素,注释,字符引用和处理指令组成,在文档中,所有这些都是通过显式的标记(markup)来指明的.XML 标记(markup)包括开始标签(tag)、结束标签、空元素标签、实
13、体引用、字符4引用、注释、CDATA 段定界符、文档类型声明,处理指令、 XML 声明、文本声明以及任何在文档实体顶层的空白(即,在文档元素之外,且不在任何其它的标记内部) 。其它所有非标记的文本组成文档的字符数据。XML 文档在逻辑上主要由以下五个部分组成。-XML声明 -文档类型声明-元素 -注释 -处理指令。XML 声明:XML 文档总是以一个 XML 声明开始,其中指明所用的 XML 版本、文档的编码、文档的独立性信息。其格式如下一对中括号()中的部分表示是可选信息。版本声明 文档编码声明 在 XML 声明中还可以加上交档编码信息,默认是 UTF-8,如果要使用中文,我们可以在声明中加
14、上 encoding=“gb2312“,如下所示:独立文档声明 如果我们的文档不依赖于外部文档在 XML 声明中,我们可以通过standalone=“yes“来声明这个文档是独立的文档,如要文档依赖于外部文档,可以通过standalone=“no“来声明。完整的 XML 声明如下所示: XML 声明必须位于文档的第一行,前面不能有任何字符。文档类型声明 DTD( Document Type Definition)文档类型定义XML 从 SGML 继承了用于定义语法规则的 DTD 机制,但 DTD 本身井不要求遵循 XML规则,几乎所用的 XML 应用都是使用 DTD 来定义的。HTML 就有一
15、个标准的 DTD 文件,所以其组织结构和所有的标签都是固定的DTD 文件也是一个文本文件,通常用 “dtd“作为其扩展名通过文档类型声明,指出 XML 文档所用的 DTD.文档类型声明有两种形式一种是声明 DTD 在一个外部的文件中,如下: 一种是直接在 XML 文档中给出 DTD,如下: 元素:在 XML 中,元素由开始标签、元素内容和结束标签构成,对于空元素,由空元素标签构成。每一个元素有一个用名字标识的类型,同时它可以有一个属性说明集,每一个属性说明有一个名字和一个值。在给元素命名的时候要注意,以“xml“或其他任何匹配(X|x)(M|m) (L|l)的字符串开头的名字,被保留用于 XM
16、L 规范的当前版本或后续版本的标准化。此外,在给元素命名时,还要遵守下列规范:1、名称只能以字母、下划线()或者冒号(:)开头;2、名称中可以包含字母、数字、下划线以及其它在 XML 标准中允许的字符;3、名称中不能包含空格;4、名称中尽可能不要使用冒号(:),因为冒号在名称空间中被用于分隔名称空间前缀和本地部分,空元素 带有属性的空元素 带有内容的元素 这是一个学生的信息 张三18带有内容和属性的元素 18 提示:“元素”和“标签”这两个词具有不同的含义。元素是指开始标签、结束标签以及两者之间的一切内容,包括属性、文本、注释以及子元素。标签是一对尖括号5()和两者之间的内容,包括元素名和所有
17、属性。例如:是一个标签,也是一个标签:而Hello World则是一个元素。元素的内容可以包含子元素、字符数据、字符引用和实体引用、CDATA 段。子元素本身也是元素,被嵌套在上层元素之内。子元素是相对于父元素而言的,如果子元素还嵌套了其它元素,那么它同时也是父元素。 张三18 .在一个元素的内容中,字符数据可以是不包括任何标记的起始定界符和 CDATA 段的结束定界符的任意字符串,也就是说在元素的内容中,字符数据不能有和号()结束.如果用的是宇符引用,需要在和号(!*#$_% 公共 DTD 名称要遵守一些约定。如果一项DTD 是 ISO 标准,它的名称要以字符串“ISO“开始。如果是一个非
18、ISO 的标准组织批准的DTD,它的名称以加号(+)开始。如果不是标准组织批准的 DTD.它的名称以连宇符(-)开始.这些开始字符或字符串后接双斜杠(/)和 DTD 所有者的名字,之后是另一个双斜杠和 DTD描述的文档类型,接着又是一个双斜杠后接 ISO 639 语言标识符,如 EN 表示英语,ZH 表示中文.在 http:/www.ics.uci.edu/pub/ietf/http/related/iso639.txt 处列有完整的 ISO639 标识符。例如我们定义的人力资源 DTD 可以采用下面的命名: -/xin sun/DTD HR 1.0/ZH连字符(-) 表示这个 DTD 不是由
19、任何标准组织批准的,为 xin sun 所有,描述的是人力资源管理,用中文编写。完整的文档类型声明如下:9HTML 网页的文档类型声明,如下 :W3C 公布的在 Web 文档中使用的有效的文档类型声明列表可以在http:/www.w3.org/QA/2002/04/valid-dtd-list.html 上找到.注意:文档类型声明与文档类型定义不是一个概念,DTD 是文档类型定义(Document Type Definition)的英文缩写。是文档类型声明,这种语法是文档类型定义。文档类型声明可以包含(内部 DTD 子集)或引用(外部 DTD 子集)一个文档类型定义,但文档类型定义从不包含文档
20、类型声明.在前面我们提到,如果我们的文档不依赖于外部文档,在 XML 声明中,可以通过standalone=“yes“来声明这个文档是独立的文档。如果文档依赖于外部文档,可以通过standalone=“no“来声明。当我们使用外部 DTD 文件时,就需要将属性 standalone 的值设置为“no“。在实际应用中,很少使用 standalone 属性,它的主要用途是作为 XML 处理器和其它应用程序的标志,表示是否需要获取外部内容。如果文档依赖于外部文档,即使我们不使用 standalone 属性,XML 处理器也能够很好地进行处理。DTD 的结构: DTD 的结构一般由元素类型声明、属性表
21、声明、实体声明、记号(notation)声明等构成。一个典型的文档类型定义文件会把将来所要创建的 XML 文档的元素结构、属性类型、实体引用等预先进行定义。元素类型声明不但说明了每个文档中可能存在的元素,给出了元素的名称,而且给出了元素的具体类型。一个 XML 元素可以为空,也可以只包含字符数据,还可以有若干个子元素,而这些子元素同时又可以有它们的子元素。元素类型声明采用如下的语法格式:元素内容说明可以指明五种可能的元素内容形式:#PCDATA 、子元素、混合内容、EMPTY 和 ANY.关键字#PCDATA 说明元素包含字符数据。例子: 人力资源标准当一个元素只包含子元素,而没有字符数据时,
22、则称此元素类型具有元素型内容(elementcontent) 。在该类型的元素声明时,通过内容模型来指定在其内容上的约束。内容模型是决定子元素类型和子元素出现顺序的一种简单语法。利用括号、逗号、竖线、星号、加号、问号的组合,可以说明很复杂的内容模型。我们看下面的例子: 这说明简历中要有名字,接下来是性别和年龄,电话和手机任选一个,可以填一个家庭住址或者不填,然后是零个或多个兴趣爱好,至少要有一个教育经历,最后是零个或多个工作经验。内容模型的规则虽然简单,但是可以产生灵活多样的结构。说明元素既可以包含字符数据,也可以包含子元素。混合内容必须被定义零个或多个。10例子: 员工信息 张三在使用混合内
23、容模型时,#PCDATA 关键字必须是模型中的第一个选项,不能在模型中使用逗号、问号和加号。用竖线分隔的#PCDATA 和元素的列表是合法的,其它用法都是不合法的。关键字 EMPTY 表明该元素既不包含字符数据,也不包含子元素,是一个空元素。如果在文档中元素本身已经表示了明确的含义,就可以在 DTD 中用关键字 EMPTY 来声明空元素。例如: 表明 br 是一个没有内容的空元素。关键宇ANY 表明该元素可以包含任何的字符数据和子元素,只要它们不违反 XML 格式良好的约束就可以了。例如: 表明 employee 可以包含任何形式的内容。在实际使用时,应该尽量避免使用 ANY,一个定义明确的
24、DTD,有助于我们理清文档的结构,更好地理解文档。实体声明:有两种类型的实体:一般实体(general entity)和参数实体(parameter entity ) 。一般实体是在文档内容中使用的实体,而参数实体则是在 DTD 中使用的已分析实体。不管是一般实体,还是参数实体都是用 ENTITY 关键字来声明。一般实体的声明语法如下:引用实体的方式为: “.参数实体只能在 DTD 中使用,它的声明语法如下 : 注意在声明时,ENTITY、 %和实体名之间各有一个空格。引用实体的方式为:“%实体名;“。在内部 DTD 子集中,参数实体引用不能在标记声明内部出现,可以在标记声明允许出现的地方出现
25、。对于外部 DTD 子集,则没有这个限制。在 DTD 中,所有的参数实体必须在引用之前进行声明。这意味着内部 DTD 子集不能引用在外部 DTD 中声明的参敌实体,这是因为 XML 处理器将首先读取内部子集,也就是说,内部子集中的实体和属性表声明的优先级要比在外部子集中的高。内部实体在 XML 文档内部定义,实体的内容在声明中给出。内部实体都是已分析的实体,它们没有单独的物理存储对象。外部实体在单独的(外部)文件中定义,外部实体可以是已分析实体,也可以是未分析实体。外部一般实体的声明形式如下:关键字 SYSTEM 表明这是一个私有的外部一般实体,后口的 URI 称为该实体的系统标识符,用于给出
26、外部文件的位置。copyright.xml 文件的内容为:2004,程序员之家,ALL Rights Reserved称为文本声明。文本声明类似于 XML 声明,不过文本声明没有 standalone 属性,并且 version 属性也是可选的。外部已分析实体可以使用不同于 UTF-8 的编码,使用文本声明来指明实体内容的编码方式。每个外部已分析实体都应该以文本声明开始,文本声明只能在外部已分析实体的开头出现,不能出现在其它任何位置。在外部已分析实体中的文本声明不会作为替换文本的一部分而出现。也可以使用PUBLIC 关键字来声明公共的外部一般实体,其声明形式和使用了关键字 PUBLIC 的外部DTD 声明类似。如下:-/Textuality/TEXT Standard open-hatch boilerplate/EN“称为该实体的公共标识符,后面的URI 部分为该实体的系统标识符。