DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。

DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

为什么使用 DTD?

通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。

通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。

而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。

您还可以使用 DTD 来验证您自身的数据

假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在一个 DOCTYPE 声明中:

<!DOCTYPE root-element [element-declarations]>

外部文档声明

假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:

<!DOCTYPE root-element SYSTEM "filename">
这个 XML 文档和上面的 XML 文档相同,但是拥有一个外部的 DTD
 

XML 文档构建模块

所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:

  • 元素
  • 属性
  • 实体
  • PCDATA
  • CDATA

PCDATA

PCDATA 的意思是被解析的字符数据(parsed character data)。

可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。

PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。

文本中的标签会被当作标记来处理,而实体会被展开。

不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &amp;、&lt; 以及 &gt; 实体来分别替换它们。


CDATA

CDATA 的意思是字符数据(character data)。

CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。

空元素通过类别关键词EMPTY进行声明:<!ELEMENT br EMPTY>  例子:<br />

只有 PCDATA 的元素通过圆括号中的 #PCDATA 进行声明:<!ELEMENT from (#PCDATA)>

通过类别关键词 ANY 声明的元素,可包含任何可解析数据的组合:<!ELEMENT note ANY>

带有一个或多个子元素的元素通过圆括号中的子元素名进行声明:<!ELEMENT note (to,from,heading,body)>

当子元素按照由逗号分隔开的序列进行声明时,这些子元素必须按照相同的顺序出现在文档中。在一个完整的声明中,子元素也必须被声明,同时子元素也可拥有子元素。

声明只出现一次的元素:<!ELEMENT note (message)>

message 子元素必须在 "note" 元素内出现至少一次:<!ELEMENT note (message+)>

子元素 message 可在 "note" 元素内出现零次或多次:<!ELEMENT note (message*)>

子元素 message 可在 "note" 元素内出现零次或一次:<!ELEMENT note (message?)>

声明"非.../既..."类型的内容:<!ELEMENT note (to,from,header,(message|body))>

上面的例子声明了:"note" 元素必须包含 "to" 元素、"from" 元素、"header" 元素,以及非 "message" 元素既 "body" 元素。

声明混合型的内容:<!ELEMENT note (#PCDATA|to|from|header|message)*>

上面的例子声明了:"note" 元素可包含出现零次或多次的 PCDATA、"to"、"from"、"header" 或者 "message"。

声明属性

  1. 属性声明使用下列语法:
  2.  
  3. <!ATTLIST element-name attribute-name attribute-type attribute-value>
  4.  
  5. DTD 实例:
  6.  
  7. <!ATTLIST payment type CDATA "check">
  8.  
  9. XML 实例:
  10.  
  11. <payment type="check" />

列举属性值

语法

  1. <!ATTLIST element-name attribute-name (en1|en2|..) default-value>
  2. 实例
  3.  
  4. DTD:
  5. <!ATTLIST payment type (check|cash) "cash">
  6.  
  7. XML 例子:
  8. <payment type="check" />

  9. <payment type="cash" />
  10. 如果您希望属性值为一系列固定的合法值之一,请使用列举属性值。

你应该避免使用属性?

一些属性具有以下问题:

  • 属性不能包含多个值(子元素可以)
  • 属性不容易扩展(为以后需求的变化)
  • 属性无法描述结构(子元素可以)
  • 属性更难以操纵程序代码
  • 属性值是不容易测试,针对DTD

如果您使用属性作为数据容器,最终的XML文档将难以阅读和维护。 尝试使用元素来描述数据。只有在提供的数据是不相关信息时我们才建议使用属性。

元数据(关于数据的数据,比如id)应当存储为属性,而数据本身应当存储为元素。
 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (;)。

一个内部实体声明

DTD 实例:

<!ENTITY writer "Donald Duck.">
<!ENTITY copyright "Copyright W3CSchool.cc">

XML 实例:

<author>&writer;&copyright;</author>

一个外部实体声明

DTD 实例:

<!ENTITY writer SYSTEM "http://www.w3cschool.cc/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3cschool.cc/entities.dtd">

XML example:

<author>&writer;&copyright;</author>

DTD的实际例子:

  1. <!DOCTYPE CATALOG [
  2.  
  3. <!ENTITY AUTHOR "John Doe">
  4. <!ENTITY COMPANY "JD Power Tools, Inc.">
  5. <!ENTITY EMAIL "jd@jd-tools.com">
  6.  
  7. <!ELEMENT CATALOG (PRODUCT+)>
  8.  
  9. <!ELEMENT PRODUCT
  10. (SPECIFICATIONS+,OPTIONS?,PRICE+,NOTES?)>
  11. <!ATTLIST PRODUCT
  12. NAME CDATA #IMPLIED
  13. CATEGORY (HandTool|Table|Shop-Professional) "HandTool"
  14. PARTNUM CDATA #IMPLIED
  15. PLANT (Pittsburgh|Milwaukee|Chicago) "Chicago"
  16. INVENTORY (InStock|Backordered|Discontinued) "InStock">
  17.  
  18. <!ELEMENT SPECIFICATIONS (#PCDATA)>
  19. <!ATTLIST SPECIFICATIONS
  20. WEIGHT CDATA #IMPLIED
  21. POWER CDATA #IMPLIED>
  22.  
  23. <!ELEMENT OPTIONS (#PCDATA)>
  24. <!ATTLIST OPTIONS
  25. FINISH (Metal|Polished|Matte) "Matte"
  26. ADAPTER (Included|Optional|NotApplicable) "Included"
  27. CASE (HardShell|Soft|NotApplicable) "HardShell">
  28.  
  29. <!ELEMENT PRICE (#PCDATA)>
  30. <!ATTLIST PRICE
  31. MSRP CDATA #IMPLIED
  32. WHOLESALE CDATA #IMPLIED
  33. STREET CDATA #IMPLIED
  34. SHIPPING CDATA #IMPLIED>
  35.  
  36. <!ELEMENT NOTES (#PCDATA)>
  37.  
  38. ]>
 
 
 
 
 
 
 
 

DTD复习笔记(复习资料为菜鸟教程里的DTD教程)的更多相关文章

  1. XML复习笔记(复习资料为菜鸟教程里的XML教程)

    XML 指可扩展标记语言(eXtensible Markup Language) XML 的设计宗旨是传输数据,而不是显示数据. XML 标签没有被预定义.您需要自行定义标签. XML 被设计为具有自 ...

  2. Java基础复习笔记系列 九 网络编程

    Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...

  3. Java基础复习笔记系列 八 多线程编程

    Java基础复习笔记系列之 多线程编程 参考地址: http://blog.csdn.net/xuweilinjijis/article/details/8878649 今天的故事,让我们从上面这个图 ...

  4. Java基础复习笔记系列 七 IO操作

    Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...

  5. Java基础复习笔记系列 五 常用类

    Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String ...

  6. Java基础复习笔记系列 四 数组

    Java基础复习笔记系列之 数组 1.数组初步介绍? Java中的数组是引用类型,不可以直接分配在栈上.不同于C(在Java中,除了基础数据类型外,所有的类型都是引用类型.) Java中的数组在申明时 ...

  7. Java基础复习笔记基本排序算法

    Java基础复习笔记基本排序算法 1. 排序 排序是一个历来都是很多算法家热衷的领域,到现在还有很多数学家兼计算机专家还在研究.而排序是计算机程序开发中常用的一种操作.为何需要排序呢.我们在所有的系统 ...

  8. Angular复习笔记7-路由(下)

    Angular复习笔记7-路由(下) 这是angular路由的第二篇,也是最后一篇.继续上一章的内容 路由跳转 Web应用中的页面跳转,指的是应用响应某个事件,从一个页面跳转到另一个页面的行为.对于使 ...

  9. Angular复习笔记7-路由(上)

    Angular复习笔记7-路由(上) 关于Angular路由的部分将分为上下两篇来介绍.这是第一篇. 概述 路由所要解决的核心问题是通过建立URL和页面的对应关系,使得不同的页面可以用不同的URL来表 ...

随机推荐

  1. Tomcat基础配置(一)

    详情请看散尽浮华的tomcat相关配置技巧梳理 本次只用于自己的查看,谢谢作者的谅解. tomcat常用架构:1)nginx+tomcat:即前端放一台nginx,然后通过nginx反向代理到tomc ...

  2. HDU 5833 Zhu and 772002 ——线性基

    [题目分析] 这题貌似在UVA上做过,高精度高斯消元. 练习赛T2,然后突然脑洞出来一个用Bitset的方法. 发现代码只需要30多行就A掉了 Bitset大法好 [代码] #include < ...

  3. 洛谷P3758 - [TJOI2017]可乐

    Portal Description 给出一张\(n(n\leq30)\)个点\(m(m\leq100)\)条边的无向图.初始时有一个可乐机器人在点\(1\),这个机器人每秒会做出以下三种行为之一:原 ...

  4. jQuary的相关动画效果

    第一种:该方法隐藏所有 <p> 元素: <html> <head> <script type="text/javascript" src= ...

  5. C 语言中可以调用命令行指令的 system()函数

    C语言有一个system函数(在<stdlib.h>头中,C++则为<cstdlib>头),可以用来调用终端命令.原型如下: int system(const char *cm ...

  6. tomcat设置去项目路径

    1. 新建一个目录专门用于存放工程, 如: G:\apache-tomcat-6.0.20\project 2. 将工程存放到以上目录下:即:G:\apache-tomcat-6.0.20\proje ...

  7. 洛谷 P1616 疯狂的采药

    传送门  题目描述 Description LiYuxiang是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他 ...

  8. PHP 之命名空间

    文件A.php namesspace a\b; Class User{ function get_user(){ echo 'this is A Class'; } } 文件B.php namessp ...

  9. vue之组件理解(一)

    组件是可复用的 Vue 实例,所以它们与 new Vue 接收相同的选项,例如 data.computed.watch.methods 以及生命周期钩子等.仅有的例外是像 el 这样根实例特有的选项. ...

  10. mysql索引底层的数据结构和算法

    1.       为什么要用索引 索引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构.索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要. 索 ...