一、简介
为什么使用DTD
通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。
通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。
而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。
您还可以使用 DTD 来验证您自身的数据。
外部文档声明
假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中: <!DOCTYPE 根元素 SYSTEM "文件名">
二、DTD——XML构建模块
XML 文档构建模块
所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:
元素 属性 实体 PCDATA CDATA
三、元素
1、在 DTD 中,XML 元素通过元素声明来进行声明。
元素声明使用下面的语法:
<!ELEMENT 元素名称 类别>
或者
<!ELEMENT 元素名称 (元素内容)>
2、空元素
空元素通过类别关键词EMPTY进行声明:
<!ELEMENT 元素名称 EMPTY>
例子: <!ELEMENT br EMPTY>
3、只有 PCDATA 的元素
只有 PCDATA 的元素通过圆括号中的 #PCDATA 进行声明:
<!ELEMENT 元素名称 (#PCDATA)>
例子: <!ELEMENT from (#PCDATA)>
4、带有任何内容的元素
通过类别关键词 ANY 声明的元素,可包含任何可解析数据的组合:
<!ELEMENT 元素名称 ANY>
例子: <!ELEMENT note ANY>
5、带有子元素(序列)的元素
带有一个或多个子元素的元素通过圆括号中的子元素名进行声明:
<!ELEMENT 元素名称 (子元素名称 1)>
或者 <!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>
例子: <!ELEMENT note (to,from,heading,body)>
当子元素按照由逗号分隔开的序列进行声明时,这些子元素必须按照相同的顺序出现在文档中。在一个完整的声明中,子元素也必须被声明,同时子元素也可拥有子元素。"note" 元素的完整声明是:
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
6、声明只出现一次的元素
<!ELEMENT 元素名称 (子元素名称)>
例子: <!ELEMENT note (message)>
上面的例子声明了:message 子元素必须出现一次,并且必须只在 "note" 元素中出现一次。
7、声明最少出现一次的元素
<!ELEMENT 元素名称 (子元素名称+)>
例子: <!ELEMENT note (message+)>
上面的例子中的加号声明了:message 子元素必须在 "note" 元素内出现至少一次。
8、声明出现零次或多次的元素
<!ELEMENT 元素名称 (子元素名称*)>
例子: <!ELEMENT note (message*)>
上面的例子中的星号声明了:子元素 message 可在 "note" 元素内出现零次或多次。
9、声明“非.../既...”类型的内容
例子: <!ELEMENT note (to,from,header,(message|body))>
上面的例子声明了:“note” 元素必须包含 “to” 元素、“from” 元素、“header” 元素,以及“message” 元素或者"body" 元素。
10、声明混合型的内容
例子: <!ELEMENT note (#PCDATA|to|from|header|message)*>
上面的例子声明了:"note" 元素可包含出现零次或多次的 PCDATA、"to"、"from"、"header" 或者 "message"。
四、属性
属性声明使用下列语法:
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
DTD 实例: <!ATTLIST payment type CDATA "check">
XML 实例: <payment type="check" />
#IMPLIED
语法 <!ATTLIST 元素名称 属性名称 属性类型 #IMPLIED>
例子 DTD: <!ATTLIST contact fax CDATA #IMPLIED>
合法的 XML: <contact fax="555-667788" />
合法的 XML: <contact />
假如您不希望强制作者包含属性,并且您没有默认值选项的话,请使用关键词 #IMPLIED。
#REQUIRED
语法 <!ATTLIST 元素名称 属性名称 属性类型 #REQUIRED>
例子 DTD: <!ATTLIST person number CDATA #REQUIRED>
合法的 XML: <person number="5677" />
非法的 XML: <person />
假如您没有默认值选项,但是仍然希望强制作者提交属性的话,请使用关键词 #REQUIRED。
#FIXED
语法 <!ATTLIST 元素名称 属性名称 属性类型 #FIXED "value">
例子 DTD: <!ATTLIST sender company CDATA #FIXED "Microsoft">
合法的 XML: <sender company="Microsoft" />
非法的 XML: <sender company="W3School" />
如果您希望属性拥有固定的值,并不允许作者改变这个值, 请使用 #FIXED 关键词。如果作者使用了不同的值, XML 解析器会返回错误。
五、实体
实体声明: 一个内部实体声明
语法: <!ENTITY 实体名称 "实体的值">
例子:
DTD 例子: <!ENTITY writer "Bill Gates"> <!ENTITY copyright "Copyright W3School.com.cn">
XML 例子: <author>&writer;©right;</author>
注释: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (;)。
实体声明: 一个外部实体声明
语法: <!ENTITY 实体名称 SYSTEM "URI/URL">
例子:
DTD 例子: <!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd"> <!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
XML 例子: <author>&writer;©right;</author>
六、XML Scema
为了克服DTD的局限性,人们提出了XML Schema即XML模式。XML模式是被开发用来替代DTD,用来定义XML文档的结构、内容和语义手段。
Schema:Schema从字面意义上来说,可以翻译成模式、大纲、计划、规划等等。它的基本意思就是说为XML文档制定一种模式 。
Schema相对于DTD的明显好处是XML Schema文档本身也是XML文档,而不是像DTD一样使用自成一体的语法。这就方便了用户和开发者,因为可以使用相同的工具来处理XML Schema和其他XML信息,而不必专门为Schema使用特殊工具。
Schema简单易懂,懂得XML语法、规则的人都可以立刻理解它。Schema的概念提出已久,但W3C的标准最近才出来,相应的应用支持尚未完善,但采用Schema已成为XML发展的一个趋势。
在Schema中,也是通过对元素的定义和元素关系的定义来实现对整个文档性质和内容的定义。
在Schema中,元素是通过它的名字和内容模型来确定,名称就是该元素的名字,而内容模型实际上就是表示元素的类型。
Schema类型(type)可以分为两种形式:
一种是非常简单的类型,被称为simple:
简单类型不能包含元素和属性(注意在Schema中和DTD中一样,都有元素属性的说法,大都相同)
一种是复杂的类型,被称为complex:
复杂类型不仅可以包含属性,而且可以在其中嵌套其他的元素,或者可以和其他元素中的属性相关联。
相对于DTD,XML模式具有如下特点:
① XML模式用于为XML文档建立一个模式,规范文档中的标记和文本可能的组合形式。XML模式可以完成DTD所能实现的所有功能,并且其本身就是规范的XML文档。
② 拥有丰富的数据类型。XML模式支持的数据类型有数字型、布尔型、整型、时间日期、URI、十进制数以及由简单类型构成的复杂数据类型。
③ 允许用户自己定义所需要的数据类型。
④ 支持属性分组。
⑤ 支持名字空间。
XMLSchema支持两种不同的数据类型:复杂类型和简单类型。复杂类型描述了实例文档中的元素的子元素和属性。简单类型是一组由字符串表示的类型,这些类型没有元素和属性。简单类型使用simpleType结构来定义,复杂类型使用complexType结构来定义。
七、XML两种文档类型
“以数据为中心”(data-centric):“以数据为中心”的XML文档着重于文档中的数据,而非文档格式,如航班信息、销售定单、科学计算结果等。这种文档的数据一般由机器产生,来源于传统数据库中的数据。主要应用在电子商务、ERP、EAI等领域,集成不同数据源的数据,交换信息。 “以文档为中心”(document-centric):“以文档为中心”的XML文档主要是用来表示人类自然语言描述的数据,如电子邮件、书和用户手册。这种文档具有更复杂的结构,一般不是机器自动产生的。目前,Web上的大部分数据都可以表示成这种文档。
八、 XML编程接口
解析:其过程包括读入文档、分解文档,然后以各种方式处理这些分解后的部分,例如存放到数据库中。 通过解析器或称编程接口。
由于XML均有起始标记及对应的结束标记,所以XML是结构化的,并且这些标记以有序的方式嵌套。同时,XML节点由标记及对应于标记的信息构成,不同的结点联系在一起,形如树状结构,当XML解析器分析XML时,在内存中会形成该文档的语法树表示,即为文档对象模型(Document Object Model,DOM)。
这里主要介绍两种主要的解析技术: DOM(Document Object ModeL)文档对象模型) SAX(Simple Api for XML),用于XML的简单API)