文档类型定义DTD
一,什么是DTD?
1,XMl是一种元标记语言,是描叙语言的语言,定义标记的语法结构,从而生成新标记。而DTD则是为新标记建立文档并进行规范说明。
也就是说XML定义标记的语法结构是通过DTD来定义,并指定文档结构的规范,而XML文档来使用标记。
2,自描述数据的规范。
二,DTD的作用
1,DTD定义了文档中的元素(标记和属性)和实体,以及相互关系。数据和结构分离。
2,通过DTD验证XML文档的有效性。DTD为解析器提供了解析XML文档的依据。所以每个XML文档必须指定对于哪个DTD有效。
三,DTD的结构
1,元素的声明:使用元素声明来声明XML文档中的元素
⑴,带有数据的元素:
<! ELEMENT 元素名 (数据类型)>
数据类型:
#CDATA:指元素包含不通过解析器解析的字符数据。特殊字符和保留字不需要转义。
#PCDATA:指元素包括解析器可解析字符数据。特殊字符和保留字需要转义才可以通过解析器。
ANY:元素可以包含任何声明类型的子元素和字符数据。
⑵,带有子元素的元素:
<! ELEMENT 元素名 (子元素1名,子元素2名)>
多个子元素用逗号隔开。
在文档中的顺序和定义中的顺序一致。
子元素可以有自己的子元素。
①相同元素只出现一次:
<! ELEMENT 元素名 (子元素)>
②相同元素至少出现一次:+
<! ELEMENT 元素名 (子元素+)>
③相同元素出现零次或多次:*
<! ELEMENT 元素名 (子元素*)>
④相同元素出现零次或一次:?
<! ELEMENT 元素名 (子元素?)>
⑶ ,空元素:
<! ELEMENT 元素名 (EMPTY)>
空元素可以有属性
⑷,混合声明
组可以是序列或选择子元素和/或子组:
①序列
<! ELEMENT A (B)> : 元素A由单个子元素B组成.
<! ELEMENT A (B, C)> :元素A由子元素B和C组成.
<! ELEMENT A (B, (C | D), E> :元素A由子元素B ,E和选择子组(C或D中之一)组成.
②选择 子元素和/或子组
<! ELEMENT A (B | C)>:元素A由子元素选择子组(B或C)组成.
<! ELEMENT A (B | C | (D, E))>:元素A由包括序列子组(D和E)的选择(B或C或D,E之一)组成.
2,属性的声明
⑴空属性
<! ATTTLIST 元素名 EMPTY>
⑵非空属性
<! ATTLIST 元素名 属性名 属性类型 属性值>
属性值:
①,Default属性值:指定一个默认值
<! ATTLIST 元素名 属性名 属性类型 "默认值" >
DTD示例:
<! ATTLIST 售价 货币单位 CDATA "人民币">
XML示例:
<售价 货币单位 = "人民币">10.90</售价>
②,Implied属性值:可以不提供该属性,该属性也没有默认值。
<! ATTLIST 元素名 属性名 属性类型 #IMPLIED >
DTD示例:
<! ATTLIST 售价 货币单位 CDATA #IMPLIED>
XML示例:
<售价>10.90</售价>
③,Required属性值:必须提供该属性,但可以没有默认值。
<! ATTLIST 元素名 属性名 属性类型 #REQUIRED >
DTD示例:
<! ATTLIST 售价 货币单位 CDATA #REQUIRED>
XML示例:
<售价 货币单位 = "美元">10.90</售价>
④,Fixed属性值:使属性具有固定值,不可以更改。
<! ATTLIST 元素名 属性名 属性类型 #FIXED "固定值">
DTD示例:
<! ATTLIST 售价 货币单位 CDATA #FIXED "人民币">
XML示例:
<售价 货币单位 = "人民币">10.90</售价>
属性类型:
①,Enumerated属性类型:使默认值成为一组固定值中之一。
<! ATTLIST 元素名 属性名 (固定值A|固定值B|...) 默认固定值之一>
DTD示例:
<! ATTLIST 售价 货币单位 ("人民币"|"美元"|"欧元") "人民币">
XML示例:
<售价 货币单位 = "欧元">10.90</售价>
②,ID和IDREF属性类型
1,ID:用于搜索某个元素的特定实例,每个元素都可以具有ID类型的属性。
<! ATTLIST 元素名 属性名 ID 属性值>
DTD示例:
<! ATTLIST 售价 支付方式 ID #REQUIRED>
XML示例:
<售价 ID = "BOOK1">10.90</售价>
<售价 ID = "BOOK2">10.90</售价>
<售价 ID = "BOOK3">10.90</售价>
2,IDREF:指向一个元素,引用其他元素中的一个元素。
<! ATTLIST 元素名 属性名 IDREF 属性值>
DTD示例:
<! ATTLIST 售价 货币单位 ID #REQUIRED>
<! ATTLIST 售价 货币单位 IDREF #IMPLIED>
<! ATTLIST 售价 货币单位 CDATA #IMPLIED>
XML示例:
<售价 ID = "BOOK1" 货币单位 = "人民币">10.90</售价>
<售价 ID = "BOOK2" IDREF = "BOOK1"></售价>
③,IDREFS属性类型
指向多个元素ID,用空格分开。用于指向XML文档中的相关元素列表。
<! ATTLIST 元素名 属性名 IDREFS 属性值>
四,使用DTD
1,内部DTD
XML声明后在XDOCTYPE声明中编写内部DTD。
<! DOCTYPE 根元素名 [
元素声明
。。。
]>
2,外部DTD
编写DTD文件,扩展名为DTD,在XML文档DOCTYPE声明中添加DTD引用,告诉解析器外部DTD信息,
<! DOCTYPE 根元素名 SYSTEM "DTD文件名.dtd">
3,DTD中的内部实体和外部实体和
参见:XML系列:XML文档结构 中的实体;
4,DTD中的参数实体
先用内部DTD声明,把参数实体设置为元素名 ,在XML文件中引用 外部DTD验证。
DTD文件
...
<! ENTITY %实体名 "字符数据">
<! ELEMENT 元素名 ( %实体名)>
<! ELEMENT %实体名 (子元素)>
...
XML文件
...
<! DOCTYPE 根元素名 SYSTEM “DTD文件名.dtd”[
<! ENTITY %实体名 "替换实体名的元素名">
]>
...
例子:不同元素的XML共同关联一个DTD文件
DTD文件
...
<! ENTITY %element "e">
<! ELEMENT root ( %element)>
<! ELEMENT %element (name,sex,。。。)>
...
XML文件1
...
<! DOCTYPE root SYSTEM “DTD文件名.dtd”[
<! ENTITY %element "student">
]>
<root>
<student>
<name>张三学生</name>
...
<student>
</root>
XML文件2
...
<! DOCTYPE root SYSTEM “DTD文件名.dtd”[
<! ENTITY %element "teatcher">
]>
<root>
<teatcher>
<name>王五老师</name>
...
<teatcher>
</root>
转载于:https://www.cnblogs.com/dkblog/archive/2009/05/07/1980751.html
相关文章:

gis中的擦除_擦除—帮助 | ArcGIS for Desktop
输出 coverage 已不存在。如果注记的左下起点位于擦除多边形内部,则擦除该注记。新结点的属性将设置为零。移除与擦除 coverage 多边形重叠的输入 coverage 多边形。擦除 coverage 必须具有面拓扑。输出 coverage 中所有要素的 User-ID 与输入 coverage 中所有要素的…

C# 3.0/3.5语法新特性示例汇总[转]
//作者:杨卫国//时间:2008年2月21日//说明:C#语法新特型示例usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;namespaceC3{ class Program { //新特性1:简单属性,无需另外多写一个私有字段,比较适合于…
Matlab编程与数据类型 -- 循环控制语句之二:while/end
本微信图文详细介绍了Matlab中while/end循环控制语句。

Centos6,7默认启动模式的更改
有时候我们想以为图形页面启动,启动后直接到图形页面,但是有时候也想启动后直接进入文本页面,我们只需要修改init即可; Centos6启动模式配置文件路径:/etc/inittab Centos7启动模式配置文件路径:/usr/lib/s…

python中计数_Python中的统计计数
关闭。此问题不符合堆栈溢出准则。它当前不接受答案。想改善这个问题吗?更新问题,使其成为Stack Overflow的主题。6年前关闭。我有一组五个字母A..E。我想将它们分成3个一组,不重复字母,但是对于从哪里开始我一无所知。解决方案假…

angular2 学习笔记 ( Rxjs, Promise, Async/Await 的区别 )
Promise 是 ES 6 Async/Await 是 ES 7 Rxjs 是一个 js 库 在使用 angular 时,你会经常看见这 3 个东西. 它们都和异步编程有关,有些情况下你会觉得用它们其中任何一个效果都一样. 但又觉得好像哪里不太对.... 这篇就来说说,我在开发时的应用方…
【转】Flex Application 初始化顺序
转自:http://www.jexchen.com 大家都知道,我们在编写Flex应用程序时,通常是以<mx:Application>标签作为开头,实际上,Flex应用程序在启动运行的时候并不是直接从Application开始运行,在这之前还有一部…
Matlab编程与数据类型 -- 分支条件选择语句if/end
本微信图文详细介绍了Matlab中if/end分支条件选择语句。

插槽 查看硬盘状态_摄影路上的“全能”伴侣 | LaCie DJI Copilot 移动硬盘
照片的安全是摄影人不得不考虑的问题,尤其是长时间外出拍摄时,一旦出现意外,比如存储卡损坏或丢失,那么千辛万苦拍摄的照片将付之东流,造成无法挽回的损失。虽然意外发生的概率并不高,但是为了保险起见&…

【转载】C语言变量详解
原链接:http://gaga.yo2.cn/articles/detailed-c-language-variables-review.html 刚做题时发现全局变量会自动初始化,如int型则自动初始化为0,double则初始化为0.000000....。而局部变量如果没有初始化的话,初值为一随机数。于是…
Matlab编程与数据类型 -- 多分支条件选择语句if/elseif/…/else/end
本微信图文详细介绍了Matlab中if/elseif/…/else/end多分支条件选择语句。

图解c/c++多级指针与“多维”数组
2019独角兽企业重金招聘Python工程师标准>>> 前言 指针与数组是C/C编程中非常重要的元素,同时也是较难以理解的。其中,多级指针与“多维”数组更是让很多人云里雾里,其实,只要掌握一定的方法,理解多级指针和…

信科c语言实验程序修改题_豆瓣评分 9.3,史上最好的 C 语言著作,竟然翻车了.........
上周,在小编的各种努力下(省略一万字),Kindle 官方终于答应给我一个广告位了。虽然只是开机屏,但我还是笑出了猪叫,毕竟上一次有这待遇还是 2018 年时的《算法图解》。所以错过了上次,这次我一定要亲眼见证这个时刻。我…

Nodejs Express dockerfile最佳实践
少啰嗦,先看代码 package.json {"name": "xxx","version": "0.0.0","private": true,"scripts": {"start": "node ./bin/www","forever": "node_modules/forever/…
Matlab编程与数据类型 -- 开关语句switch/end
本微信图文详细介绍了Matlab中switch/end开关语句。

安装ATi显卡驱动后增加的鼠标右键菜单的清理
一般最直接的方法是:一般位于注册表的:删除注册表HKEY_CLASSES_ROOT\Directory \Background\shellex\ContextMenuHandlers\ACE下 ab默认{5E2121EE-0300-11D4-8D3B-444553540000}办法一:刚才有朋友询问了ATi显卡在安装CATALYST Control Center…

15crmo焊接后多长时间探伤_15CrMo十五铬钼属于合金钢?、下面来解释一下
15CrMo十五铬钼属于合金钢,主要用于石油、石化、高压锅炉等,专门用途的无缝管有锅炉用无缝管、地质用无缝钢管及石油用无缝管等多种。一、15CrMo化学成分:C:0.12-0.18 Mn:0.40-0.70 Si:0.17-0.37 Cr:0.…

VTL-vm模板的变量用法
加载foot模块页 #parse("foot.vm") #foreach($item in $tables) #set($strEnd $item.Length - 1) #set($sheetName $item.Substring(0, $strEnd)) <option value"$item">$sheetName</option> #end $strEnd也可以看做一个字符串来操作 $it…

百度云磁盘CDS、对象存储BOS技术深度解析
在BAT中,百度在公有云也有很多技术创新。比如2013年引起广泛关注的ARM存储服务器就是一个很好的例子。最近两年,百度云开始发力,其云存储体系有诸多创新之处。目前百度云存储形成了以块存储、对象存储、文件存储为核心,VPN/专线、…
Matlab编程与数据类型 -- 出错处理语句try/catch/end
本微信图文详细介绍了Matlab中try/catch/end出错处理语句。

linux设置nexus开机自启动_在linux中使用nexus搭建maven私服
首先介绍下为什么要搭建maven私服,简单点说就是就是把项目工程中的Jar包放在一个服务器上,每次Jar包的修改都能去私服上面Down到本地。可以对整个项目组的人形成一个统一的管理。2、下载完之后就是这个了:我这个是目前最新的版本了࿰…

Lintcode42 Maximum Subarray II solution 题解
【题目描述】Given an array of integers, find two non-overlapping subarrays which have the largest sum.The number in each subarray should be contiguous.Return the largest sum.Notice:The subarray should contain at least one number给定一个整数数组,…

const用法详解
面向对象是C的重要特性. 但是c在c的基础上新增加的几点优化也是很耀眼的 就const直接可以取代c中的#define 以下几点很重要,学不好后果也也很严重 const 1. 限定符声明变量只能被读 const int i5; int j0; ... ij; //非法,导致编译错误 ji; //合法 2. 必…
Matlab编程与数据类型 -- continue、break和return语句
本微信图文详细介绍了Matlab中的continue、break和return语句。

mysql 修复_修复崩溃的Mysql
在mysql的配置文件my.cnf里找到 [mysqld]字段下,添加 innodb_force_recovery 1如果innodb_force_recovery 1不生效,则可尝试2——6几个数字然后重启mysql,重启成功。然后使用mysqldump或 pma 导出数据,执行修复操作等。修复完成…

window.open(url?param=+paramvalue) 服务端 乱码问题解决
window.open("url?param"paramvalue)传递参数出现乱码,在客房端显示是正常的,可是到服务端就是乱码。 1. 利用一个js在客户端转码的函数,escape(str);但是传到服务端仍然是乱码,所以必须在服务端进行解码。 2. 服务端执…
Matlab编程与数据类型 -- 数据类型概述
本微信图文详细介绍了Matlab中的数据类型,数值型和逻辑型举例介绍,其它类型在相应图文进行介绍。

初识mysql数据字段属性_初识mysql
# 经典sql语句 创建数据库- CREATE DATABASE database_name; 删除数据库- DROP DATABASE database_name; 创建备份数据库- USE masterEXEC sp_addupdevice disk,testBack ,c:\xxx\xxx.dat 开始备份- BACKUP DATABASE pubs TO testBack;--- 创建表- 创建新表 create table tab_n…

ceph存储引擎bluestore解析
原文链接:http://www.sysnote.org/2016/08/19/ceph-bluestore/ ceph后端支持多种存储引擎,以插件式的方式来进行管理使用,目前支持filestore,kvstore,memstore以及最新的bluestore,目前默认使用的filestor…
Matlab编程与数据类型 -- 字符型数组
本微信图文详细介绍了Matlab中的字符串类型。