DTD概述

DTD用来定义XML文档的结构,它包含一系列规则说明,以确保XML文档的一致性和有效性
DTD定义了XML文档可用的词汇(元素和属性的名称)和结构:
元素名称,包括根元素
元素的属性及属性的数据类型和取值方式
子元素的名称、顺序、出现次数
元素是否拥有子元素,是否能拥有文本内容,等等
可以用DTD验证XML文档
发现书写错误(命名错误)
检查结构和顺序
检查是否使用了规定的规范文档

DTD的引用

DTD可以是被XML引用的独立的外部文档,也可以嵌入到XML文档中
DTD文档是特殊格式的XML文档 例如,DTD文档student.dtd的内容如下:

[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!ELEMENT 班级 (学生+)>
  3. <!ELEMENT 学生 (ID, 姓名, 年龄?, 住址?, 电话*)>
  4. <!ELEMENT ID (#PCDATA)>
  5. <!ELEMENT 姓名 (#PCDATA)>
  6. <!ELEMENT 年龄 (#PCDATA)>
  7. <!ELEMENT 住址 (#PCDATA)>
  8. <!ELEMENT 电话 (座机*, 手机?)>
  9. <!ELEMENT 座机 (#PCDATA)>
  10. <!ELEMENT 手机 (#PCDATA)>

嵌入的DTD

[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE 班级 [
  3. <!ELEMENT 班级 (学生+)>
  4. <!ELEMENT 学生 (ID, 姓名, 年龄?, 住址?, 电话*)>
  5. <!ELEMENT ID (#PCDATA)>
  6. <!ELEMENT 姓名 (#PCDATA)>
  7. <!ELEMENT 年龄 (#PCDATA)>
  8. <!ELEMENT 住址 (#PCDATA)>
  9. <!ELEMENT 电话 (座机*, 手机?)>
  10. <!ELEMENT 座机 (#PCDATA)>
  11. <!ELEMENT 手机 (#PCDATA)>
  12. ]>
  13. <班级>
  14. <学生>
  15. <ID>001</ID>
  16. <姓名>王刚</姓名>
  17. <年龄>2</年龄>
  18. <电话>
  19. <手机>234345456</手机>
  20. </电话>
  21. </学生>
  22. </班级>

外部DTD-SYSTEM
在XML文档中声明使用外部DTD文档 <!DOCTYPE 根元素名称 SYSTEM “DTD文档URL”>
 例如,XML文档student.xml的内容如下:

[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE 班级 SYSTEM “student.dtd”>
  3. <班级>
  4. <学生>
  5. <ID>001</ID>
  6. <姓名>王刚</姓名>
  7. <年龄>2</年龄>
  8. <电话>
  9. <手机>234345456</手机>
  10. </电话>
  11. </学生>
  12. </班级>

外部DTD-PUBLIC
在XML文档中声明使用公共DTD文档 <!DOCTYPE 根元素名称 PUBLIC “公共标识符” “URI” 公共标识符的格式为:  标准//作者//类型和版本//语言 例如,XML文档student.xml的内容如下:

[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE 班级 PUBLIC “-//WeiDP//Example 1.0//ZH-CN” “student.dtd”>
  3. <班级>
  4. <学生>
  5. <ID>001</ID>
  6. <姓名>王刚</姓名>
  7. <年龄>2</年龄>
  8. <电话>
  9. <手机>234345456</手机>
  10. </电话>
  11. </学生>
  12. </班级>

元素Element

ANY:内容中可包含子元素
格式:<!ELEMENT 元素名称 ANY>
示例:<段落>使用<关键词>XML</关键词>技术</段落>
EMPTY:不能包含任何内容
格式:<!ELEMENT 元素名称 EMPTY>
示例:<paper color=“red”/>
#PCDATA:不能包含子元素
格式:<!ELEMENT 元素名称 (#PCDATA)>
示例:<book author=“Black”>C Language</book>
子元素的顺序和出现频率
<!ELEMENT 元素名称 (子元素名称[修饰符][,…])>
其中,修饰符为:
省略:必须出现,且只能出现1次
+:至少出现1次
?:最多出现1次
*:可以不出现,也可以出现多次
示例:<!ELEMENT cpu (厂商,型号+,工艺?,价格*)>
子元素的选择
<!ELEMENT 元素名称 (子元素[|子元素]…]) >
示例: <!ELEMENT 电话 (座机|手机)>

[html] view plaincopy
  1. <?xml version="1.0" encoding="GB2312" standalone="no"?>
  2. <!DOCTYPE 我的电脑 [
  3. <!ELEMENT 我的电脑 (CPU, 内存+, 硬盘+)>
  4. <!ELEMENT CPU EMPTY>
  5. <!ELEMENT 内存 (描述*)>
  6. <!ELEMENT 分区 (名称, 操作系统)>
  7. <!ELEMENT 名称 (#PCDATA)>
  8. <!ELEMENT 操作系统 (#PCDATA)>
  9. <!ELEMENT 硬盘 (分区+, 描述*)>
  10. <!ELEMENT 描述 ANY>
  11. ]>
  12. <我的电脑>
  13. <CPU/>
  14. <内存><描述>="512MB"</描述></内存>
  15. <内存/>
  16. <硬盘>  <分区>
  17. <名称>系统盘</名称>
  18. <操作系统>Windows 2003</操作系统>
  19. </分区>
  20. <描述>关于系统盘的任何描述信息</描述>
  21. </硬盘>
  22. </我的电脑>

属性列表ATTLIST

ATTLIST定义元素的属性的名称、类型和默认值,可以限制出现次数但不能限制出现顺序
语法:<!ATTLIST 元素名称  属性1名称 属性类型 属性值声明  属性2名称 属性类型 属性值声明 ……>
属性类型
CDATA:一般文本
ID:具有ID属性值,不能重复(唯一性)
IDREF:对ID属性值的引用
IDREFS:对ID属性值列表的引用(用空白分割)
ENTITY:引用未解析的外部实体
ENTITIES:引用ENTITY列表(用空白分割)
NMTOKEN:包含一个有效的XML名称
NMTOKENS:NMTOKEN列表
(属性值[[|属性值]…]):属性为NMTOKEN类型,只能取列表中的值
NOTATION (属性值[[|属性值]…]):属性为NOTATION(已定义的),取值任选其一
属性值说明
#REQUIRED:该属性必须出现
#IMPLIED:该属性是可选的
“默认值”:属性是可选的;若不出现,在验证文档后,元素将隐含该属性,取默认值
#FIXED “固定值”:属性是可选的;若出现,属性值必须取固定值;若不出现,则验证后自动隐含该固定值
例如:

[html] view plaincopy
  1. <?xml version="1.0" encoding="GB2312"?>
  2. <!—该文件保存为computer.dtd-->
  3. <!ELEMENT 我的电脑 (CPU, 内存+, 硬盘+)>
  4. <!ELEMENT CPU EMPTY>
  5. <!ATTLIST CPU
  6. 厂商 (AMD | Intel | Other) “Intel"
  7. 序列号 CDATA #IMPLIED
  8. 工作频率 CDATA #REQUIRED
  9. >
  10. <!ELEMENT 内存 (描述*)>
  11. <!ATTLIST 内存
  12. 容量 CDATA #REQUIRED
  13. >
  14. <!ELEMENT 分区 (名称, 操作系统)>
  15. <!ATTLIST 分区
  16. 盘符 NMTOKEN #REQUIRED
  17. >
  18. <!ELEMENT 名称 (#PCDATA)>
  19. <!ELEMENT 操作系统 (#PCDATA)>
  20. <!ELEMENT 硬盘 (分区+, 描述*)>
  21. <!ATTLIST 硬盘
  22. 容量 CDATA #REQUIRED
  23. >
  24. <!ELEMENT 描述 ANY>

xml

[html] view plaincopy
  1. <?xml version="1.0" encoding="GB2312" standalone="no"?>
  2. <!DOCTYPE 我的电脑 SYSTEM "computer.dtd">
  3. <!--以上部分称为XML文档的“序言”(Prolog)-->
  4. <我的电脑>
  5. <CPU 厂商="AMD" 工作频率="1.5GHz"/>
  6. <内存 容量="512MB">
  7. <描述>Kingmax DDR 4000</描述>
  8. </内存>
  9. <内存 容量="512MB"/>
  10. <硬盘 容量="80GB">
  11. <分区 盘符="C">
  12. <名称>系统盘</名称>
  13. <操作系统>
  14. <![CDATA[> Windows 2003 <]]>
  15. </操作系统>
  16. </分区>
  17. </硬盘>
  18. </我的电脑>

示例二

[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE 班级 [
  3. <!ELEMENT 班级 (学生+, 班长?)>
  4. <!ELEMENT 班长 EMPTY>
  5. <!ATTLIST 班长 学号 IDREF #REQUIRED>
  6. <!ELEMENT 学生 (姓名, 年龄?, 住址?, 电话*)>
  7. <!ATTLIST 学生
  8. 学号 ID #REQUIRED
  9. 性别 (男 | 女) "男"
  10. 系别 CDATA "计算机"
  11. >
  12. <!ELEMENT 姓名 (#PCDATA)>
  13. <!ELEMENT 年龄 (#PCDATA)>
  14. <!ELEMENT 住址 (#PCDATA)>
  15. <!ELEMENT 电话 (座机*, 手机?)>
  16. <!ELEMENT 座机 (#PCDATA)>
  17. <!ELEMENT 手机 (#PCDATA)>
  18. ]>

xml

[html] view plaincopy
  1. <班级>
  2. <学生 学号="s05601" 性别="女">
  3. <姓名>王刚</姓名>
  4. <年龄>2</年龄>
  5. <电话>
  6. <手机>234345456</手机>
  7. </电话>
  8. </学生>
  9. <学生 学号="S05046" 性别="男" 系别="材料">
  10. <姓名>孙俊</姓名>
  11. <住址>203房间</住址>
  12. </学生>
  13. <学生 学号="s05603">
  14. <姓名>孙俊</姓名>
  15. <住址>203房间</住址>
  16. <电话>
  17. <座机>45655656
  18. </座机>
  19. <座机>465675</座机>
  20. </电话>
  21. </学生>
  22. <班长 学号="s05601"/>
  23. </班级>

注记notation
XML文档可以包含非XML数据(不能由解析器直接处理),例如图像、声音等,需要告知解析器如何调用外部程序处理这些数据,否则就会出错。
NOTATION将非XML数据描述为一种能够被外部程序处理的形式
格式:<!NOTATION 名称 SYSTEM “系统标识符”>
例如:<!NOTATION jpg SYSTEM “image/jpeg”>
notation实例

[html] view plaincopy
  1. <?xml version="1.0" encoding="GB2312"?>
  2. <!ELEMENT 相册 (照片)+>
  3. <!ELEMENT 照片 (#PCDATA)>
  4. <!NOTATION jpg SYSTEM "image/jpeg">
  5. <!NOTATION gif SYSTEM "image/gif">
  6. <!NOTATION png SYSTEM "image/png">
  7. <!ATTLIST 照片
  8. 名称 NMTOKEN #REQUIRED
  9. 文件类型 NOTATION (jpg | gif | png) #IMPLIED
  10. >

实体ENTITY

逻辑上,一个XML文档只有一个根元素,根元素包含所有子元素和内容。但XML文档中可以引用来自其他文档(文件)中的数据(内容),这就是实体。例如,可以将论文标题定义为实体,就可以在文中多次引用,而不必重复输入,也便于修改标题。
实体存储的内容有形式规范的XML、其他形式的文本或二进制数据。实体可以是文件、数据记录或任何包含数据的项目。除了文档实体外,多数实体都有名称。
实体定义在DTD中,在与该DTD关联的XML文档中通过实体引用使用这些实体,XML解析器会在解析标记时,用实体的内容替换实体引用。

普通实体
  内部普通实体
<!ENTITY 实体名称  “实体内容”>
例如,<!ENTITY UPC “中国石油大学”>
  外部普通实体
<!ENTITY 实体名称 SYSTEM “URI”>
例如,<!ENTITY UPC SYSTEM “/XML/upc.xml”>
<!ENTITY 实体名称 PUBLIC FPI “URI”>
其中,FPI是经认可的全球唯一的公共标识符,形如“前缀//使用者标识//文本类//文本描述//语言”
例如,<!ENTITY hello PUBLIC “-//ISO9//me//Hello//EN” “/xml/hello.xml”>
book_intro.xml文档

[html] view plaincopy
  1. <?xml version="1.0" encoding="GB2312"?>
  2. <内容简介>适合计算机专业本科学习</内容简介>
[html] view plaincopy
  1. <?xml version="1.0" encoding="GB2312"?>
  2. <!DOCTYPE 图书 [
  3. <!ENTITY copyright "版权所有,2007">
  4. <!ENTITY intro SYSTEM "book_intro.xml">
  5. <!ELEMENT 图书 (书名, 作者, 内容简介)>
  6. <!ELEMENT 书名 (#PCDATA)>
  7. <!ELEMENT 作者 (#PCDATA)>
  8. <!ELEMENT 内容简介 (#PCDATA)>
  9. ]>
  10. <图书>
  11. <书名>计算概论(©right;)
  12. </书名>
  13. <作者>张三</作者>
  14. &intro;
  15. </图书>

未解析实体

外部未解析实体可以将非XML文档数据引入XML文档进行处理
引入XMl文档
<!ENTITY 名称 SYSTEM “URI”>
URI对应XML文档
引入非XML文档
<!ENTITY 名称 SYSTEM “URI” NDATA 类型声明>
类型声明用于描述文档类型

[html] view plaincopy
  1. <?xml version="1.0" encoding="GB2312"?>
  2. <!DOCTYPE IMAGE [
  3. <!ELEMENT IMAGE (PIC)>
  4. <!NOTATION gif SYSTEM "image/gif">
  5. <!ENTITY pic SYSTEM "office.gif" NDATA gif>
  6. <!ELEMENT PIC EMPTY>
  7. <!ATTLIST PIC src ENTITY #REQUIRED>
  8. ]>
  9. <IMAGE>
  10. <PIC src="pic"/>

XML文档类型定义DTD相关推荐

  1. XML——文档类型定义(DTD-Document Type Definition)

    [0]README 0.1)本文文字描述转自 core java volume 2 , 旨在理解 XML--文档类型定义(DTD-Document Type Definition) 的基础知识: 0. ...

  2. XML--- XML文档类型定义(DTD)

    **定义:**DTD定义了文档的逻辑结构,规定了文档中所使用的元素.实体.元素的属性.元素与实体之间的关系.其作用主要表现在以下几个方面. (1) 使用DTD可以提供一种统一的格式.XML的可扩展性为 ...

  3. DTD(文档类型定义)概述

    DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块.DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用. DTD 简介 文档类型定义(DTD)可定义合法的XML文档构建模块.它 ...

  4. XML之文档类型定义和合法性(转)

    来至:liang--liang博客:http://www.cnblogs.com/liang--liang/archive/2008/01/15/1039277.html 好牛 XML被作为一种元标记 ...

  5. 文档声明Doctype和Doctype html区别 文档类型定义(DTD)

    文档类型定义(DTD)可定义合法的XML文档构建模块.它使用一系列合法的元素来定义文档的结构. DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用. 文档声明的作用: 文档声明是为了告诉浏 ...

  6. DOCTYPE html PUBLIC 指定了 HTML 文档遵循的文档类型定义

    DOCTYPE html PUBLIC 指定了 HTML 文档遵循的文档类型定义 今天看到一篇CSS应用的一个友好搜索,我按网页上的代码复制.粘贴后预览时总达不到效果,而直接拷贝他的实例却能达到效果, ...

  7. 文档类型定义和合法性(2)

    8.5.3 子元素列表 由于SEASON元素被声明为可以接受任何元素作为子元素,因而可以接受各种各样的元素.当遇到那些多多少少有些非结构化的文本,如杂志文章时,这种情况就很有用.这时段落.副栏.项目列 ...

  8. 前端:HTML5/36/HTML5简介,文档类型定义,网页字符集,页面结构标记,文章相关的标记,其它标记,音频标记,视频标记,表单中新增的属性,表单input元素type属性的值

    HTML5简介 HTML5是新一代的HTML: HTML5目前主要应用在手机端,在PC端最新浏览器已经开始支持了,但还不全面: HTML5是由W3C和WHATWG合作的结果: W3C是万维网联盟,主要 ...

  9. J2EE之dtd(文档类型定义)

    一:良好xml的格式 1:xml的作用 1.1 数据交互(两种方式) 第一种:{name:xxx,sex:'男',age:18},{name:xxx,sex:'男',age:18},{name:xxx ...

最新文章

  1. asp.net 2.0中新增的AppendDataBoundItems .dropdownlist 添加第一项
  2. 谷歌让NLP模型也能debug,只要给一张「草稿纸」就行
  3. nginx之upsream实现负载均衡
  4. 第一个只出现一次的字符位置
  5. codeblocks全屏模式怎么退出_IntelliJ IDEA 2020.1 EAP2 发布:新增禅模式和 LightEdit 模式...
  6. 大厂面试常见的几道SQL题,看你能答吗?
  7. 使用Spring Boot构建REST Web服务
  8. 微信企业号第三方应用开发[一]——创建套件
  9. matlab编译dll vb调用,用matlab的deploytool生成DLL,VB无法调用的问题
  10. Unicode和UTF-8之间的转换详解
  11. 【php】mysql全局ID生成方案
  12. Intel DPDK 源代码分析
  13. GoogLeNet 之 Inception v1 v2 v3 v4
  14. 串口服务器调试助手使用教程,串口调试助手使用教程【操作方式】
  15. shell脚本:自动更新动态域名的IP地址
  16. idea中translation插件显示网络异常(试一试)
  17. 快学会这个技能-.NET API拦截技法
  18. 【nlp学习】中文命名实体识别(待补充)
  19. dotnet 从入门到放弃的 500 篇文章合集
  20. Linux中的高级网络控制

热门文章

  1. MySQL防止库存超卖方法总结
  2. BZOJ3526[Poi2014]Card——线段树合并
  3. vue基础9(babel)
  4. iOS企业版使用第三方实现自动更新版本
  5. JS选中OPTION
  6. 移动手机平台的HTML5前端优化指南
  7. 每日站立会议4-20(张硕)
  8. floyd 判圈算法 UVa 11549 计算器谜题
  9. 一个 提高SQL 查询的讨论帖
  10. 算法学习:计算几何旋转卡壳