DTD约束文件
在讲解DTD文件之前,我要说说一份合格的XML应该符合怎么样的规则?
就我总结一下几点,大家看看就好了:
1.一份XML有且仅有一个根元素。
2.XML是严格区分大小写的,<book>元素和<Book>元素是不相同的。
3.如果一个元素不需要子内容的话,它就是一个空元素,应写成:<元素名 />,就不要写成这样了:<元素名><元素名 />
4.XML文档开头声明:
<?xml version="1.0" encoding="UTF-8"?>
声明以"<?"开头,以"?>"结束,中间version属性是必须的,是指该文档遵守XML1.0的规范,encoding是XML进行解码的时候所用的字符集,注意是解码不是编码,默认是用utf-8,该属性是可选的,此外还可能接触到一个standalone,它指定的是是否引用其他资源,它的值只有yes跟no
5.如果元素中有空白字符的话,XML会原样保留,而HTML会把多个删除成一个再输出
6.XML预留了几种实体引用::<:代表着小于号,>代表着大于号,&:代表and符号,'代表英文的单引号,"代表英文的双引号,通过这些内置的实体引用,可以避免文档符号的冲突,保持良好的文档规范。
7.CDATA标记:在CDATA标记下,里面的内容都是当做字符串来处理,即使是合法的字符,也会当做字符来处理。
<?xml version="1.0" encoding="UTF-8"?>
<book>
<describe>
<![CDATA[
<a>
author:xujianguo
</a>
]]>
</describe>
</book>
输出<a>xujianguo</a>
8.注释格式:<!-- 注释内容 -->
下面正式讲解一下DTD文件:
DTD文件为什么存在?
一份XML文件下来,如果你没有添加约束条件的话,你要怎么写就怎么写,很不规范,同时也意味着别人不熟悉你的XML文件的条件下也可以操作你的XML文件,而通过DTD约束文件,可以约束每个元素内部可以出现哪些子元素,可以支持什么属性,这个就是DTD存在的理由了。
引入的DTD:
方法一:内部DTD - 就是将DTD与XML数据定义放在同一个文档中,格式如下:
<?xml version="1.0" encoding="UTF-8"?>
<! DOCTYPE 根元素名[
元素描述
]>
XML文档主体部分
由上面我们也可以看出一个引入DTD最开始的格式了:
<! DOCTYPE 根元素名[
元素描述
]>
方法二:外部DTD - 就是将外部DTD的地址告诉XML,所以在XML中要说明一下地址在哪里。格式:<! DOCTYPE 根元素名 SYSTEM "外部DTD的URI">
现在假设在自己XML文档的相同路径下有个book.dtd文件,就可以这样引入:
<?xml version="1.0" encoding="UTF-8"?>
<! DOCTYPE book SYSTEM "book.dtd">
<book>
<describe>
<![CDATA[
<a>
author:xujianguo
</a>
]]>
</describe>
</book>
定义元素:
格式:<!ELEMENT 元素名 元素类型描述>
元素类型描述主要有如下几种:
| 类型 | 描述 | 语法 |
| 任意类型 | 这种元素即可以是字符串,也可以是其他子元素 | <!ELEMENT 元素名 ANY> |
| 字符串值 | 这种元素只能是字符串,不能包含其他子元素 | <!ELEMENT 元素名 (#PCDATA)> |
| 空元素 | 这种元素只能为空元素,空元素前面有介绍 | <!ELEMENT 元素名 EMPTY> |
| 包含子元素 | 元素中可以出现子元素 | <!ELEMENT 父元素 (子元素)> |
| 混合类型 | 可以出现以上的类型 | <!ELEMENT 父元素 (#PCDATA|子元素|子元素|子元素...)> |
现在我们就利用上面所学的知识简单的写一个DTD:
language.dtd:
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT language ANY>
<!ELEMENT codeLanguage (#PCDATA | Java | C | Python)* >
<!ELEMENT Java (#PCDATA)>
<!ELEMENT C EMPTY>
<!ELEMENT Python EMPTY>
language.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language SYSTEM "language.dtd">
<language>
<C />
<codeLanguage>
<C />
<Python />
<Java>
I am Java
</Java>
</codeLanguage>
<codeLanguage>
Other Language
</codeLanguage>
</language>
下面讲解的是有关子元素的一些知识点:
定义有序的子元素:如果使用引文英文逗号(,)作为子元素之间的分隔符,则子元素之间必须遵守定义的顺序。
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT language (codeLanguage)>
<!ELEMENT codeLanguage (Java, C, Python)>
<!ELEMENT Java (#PCDATA)>
<!ELEMENT C (#PCDATA)>
<!ELEMENT Python (#PCDATA)>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language SYSTEM "test.dtd">
<language>
<codeLanguage>
<Java/>
<C/>
<Python/>
</codeLanguage>
</language>
上面的Java、C、Python是按照定的顺序来的
定义互斥的子元素:互斥的子元素表名一系列子元素之间只能出现其中的一个,互斥的子元素用竖线(|)分隔
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT language (codeLanguage)*>
<!ELEMENT codeLanguage (Java | C | Python)>
<!ELEMENT Java (#PCDATA)>
<!ELEMENT C (#PCDATA)>
<!ELEMENT Python (#PCDATA)>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language SYSTEM "test.dtd">
<language>
<codeLanguage>
<Java>
I am Java
</Java>
</codeLanguage>
<codeLanguage>
<C>
I am C
</C>
</codeLanguage>
<codeLanguage>
<Python>
I am Python
</Python>
</codeLanguage>
</language>
子元素出现的频率:
符号表:
| 符号 | 表示频率 |
| + | 表明子元素可以出现1次或者多次 |
| * | 表明子元素可以出现0次或者多次 |
| ? | 表明子元素可以出现0次或者1次 |
定义无序的子元素:DTD没有专门为定义无序的子元素提供特定的语法,如果希望定义无序的元素的话,通过前面的语法和频率组合来实现
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT language (codeLanguage)*>
<!ELEMENT codeLanguage (Java | C | Python)+>
<!ELEMENT Java (#PCDATA)>
<!ELEMENT C (#PCDATA)>
<!ELEMENT Python (#PCDATA)>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language SYSTEM "test.dtd">
<language>
<codeLanguage>
<Java>
I am Java
</Java>
<Python>
I am Python
</Python>
</codeLanguage>
<codeLanguage>
<Python>
I am Python
</Python>
<C>
I am C
</C>
</codeLanguage>
<codeLanguage>
<Python>
I am Python
</Python>
<C>
I am C
</C>
<C>
I am C
</C>
</codeLanguage>
</language>
定义元素属性:
DTD为XML添加属性提供了支持,DTD中定义属性的语法格式:<!ATTLIST 属性所属的元素 属性名 属性类型 [元素对属性的约束][默认值]>
元素对属性的约束介绍表:
| 约束 | 描述 |
| #REQUIRED | 必需的属性,意味着必须为该元素指定该属性 |
| #IMPLIED | 该属性可有可无 |
| #FIXED | 该属性的值是固定的,定义时必须指定固定值 |
DTD支持的属性类型:
| 类型 | 说明 |
| CDATA | 该属性值只能是字符串数据 |
| (en1 | en2 | en3) | 该属性值是一系列枚举值之一 |
| ID | 该属性值必须是有效的标示符,且该属性值可用于表示该元素,在XML中必须唯一 |
| IDREF | 该属性值必须引用自另一个已有的ID属性值 |
| IDREFS | 该属性值必须引用自多个已有的ID属性值,多个ID属性值之间用空格隔开 |
| NMTOKEN |
该属性值必须是一个合法的XML名称,它也指定了该属性值是字符串数据,但比CDATA具有更强的约束,它 表明属性值只能由字母、数字、英文下划线、英文中划线、英文点号、英文冒号等组成 |
| NMTOKENS | 该属性值可以是多个NMTOKEN,过个NMTOKEN之间用空格隔开 |
| ENTITY | 该属性值是一个外部实体,例如图片文件 |
| ENTITIES | 该属性值是多个外部实体,多个实体之间用空格隔开 |
| NOTATION | 该属性值是在DTD声明过的符号(NOTATION),这是个将要过期的规范看,避免使用 |
| xml: | 该属性值是一个预定义的XML值 |
下面一个例子演示一个有关枚举类型、ID、IDREF、IDREFS、NMTOKEN和NMTOKENS类型的使用:
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT language (codeLanguage)*>
<!ELEMENT codeLanguage (Java | C | Python)+>
<!ELEMENT Java (#PCDATA)>
<!ELEMENT C (#PCDATA)>
<!ELEMENT Python (#PCDATA)>
<!ATTLIST Java type (JavaSE | JavaEE | JavaME) #REQUIRED>
<!ATTLIST C id ID #REQUIRED>
<!ATTLIST Python ref IDREF #IMPLIED>
<!ATTLIST Python refs IDREFS #IMPLIED>
<!ATTLIST codeLanguage author NMTOKEN #IMPLIED>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language SYSTEM "test.dtd">
<language>
<codeLanguage author="xujianguo">
<Java type="JavaEE">
I am JavaEE
</Java>
<C id="c">
I am C
</C>
<C id="ccc">
I am C
</C>
<Python ref="c">
I am Python
</Python>
<Python refs="c ccc">
I am Python
</Python>
</codeLanguage>
</language>
下面大家来看看怎么定义实体:
语法格式:<!ENTITY 实体名 "实体值">
使用实体的语法格式:&实体名;
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT language (codeLanguage)*>
<!ELEMENT codeLanguage (Java | C | Python)+>
<!ELEMENT Java (#PCDATA)>
<!ELEMENT C (#PCDATA)>
<!ELEMENT Python (#PCDATA)>
<!ATTLIST Java type (JavaSE | JavaEE | JavaME) #REQUIRED>
<!ATTLIST C id ID #REQUIRED>
<!ATTLIST Python ref IDREF #IMPLIED>
<!ATTLIST Python refs IDREFS #IMPLIED>
<!ATTLIST codeLanguage author NMTOKEN #IMPLIED>
<!ENTITY java "I am Java">
<!ENTITY c "I am C">
<!ENTITY python "I am Python">
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language SYSTEM "test.dtd">
<language>
<codeLanguage author="xujianguo">
<Java type="JavaEE">
&java;
</Java>
<C id="c">
&c;
</C>
<C id="ccc">
&c;
</C>
<Python ref="c">
&python;
</Python>
<Python refs="c ccc">
&python;
</Python>
</codeLanguage>
</language>
DTD约束文件的更多相关文章
- 【转】xml文件中加入本地的dtd约束文件
首先,我是以加载Struts2的来演示: 1 我们可以看到,越是文件中的 显示的是PUBLIC, 即从网络中获取约束文件dtd ,此时我需要将其配置成从自己的本地来获取dit文件 首先,先要有stru ...
- MyEclipse配置Struts2的本地工作空间中的DTD约束文件
1.拷贝URI http://struts.apache.org/dtds/struts-2.3.dtd 2.配置XML Catalog 3.struts-2.3.dtd文件来源 解压jar包\Web ...
- eclipse如何在不联网的情况下引入dtd约束文件
1. 获取dtd文件,解压 F:\Java配置文件\Mybatis\mybatis-3.3.0\mybatis-3.3.0.jar\org\apache\ibatis\builder\xml\ 路径下 ...
- Mybatis:Eclipse引入dtd约束文件使得xml文件有提示
https://blog.csdn.net/lsx2017/article/details/82558135
- 作业:xml练习2-写.xml的外部约束文件(dtd文件)
写外部DTD: 步骤: 1.在srd目录下新建DTD文件,并命名为:scores.dtd 2.在练习1的基础上,剪切练习1的DTD内部声明.粘贴到一个新建的DTD文件中.剪切之后的地方换上:包含外部D ...
- Eclipse引入自定义XML约束文件(DTD,SCHEMA)问题
Eclipse引入自定义XML约束文件(DTD,SCHEMA)问题 1:说明 使用Eclipse 编写xml文件的约束文件的,包括DTD约束文件,Schema约束文件的时候, 我们也需要接受eclip ...
- DTD约束的校验工具安装及检验(Iexmltls工具)
通过打开我们写的dtd约束文档,我们可以看到,在我们不按规定的格式打开xml时并不能检验出错误.此时我们可以借助软件来帮助我们校验. Iexmltls是一个在IE浏览器下安装的用于检验xml约束是否正 ...
- DTD约束简介
DTD约束简介 文档类型声明 文档类型声明就是DOCTYPE,它告诉解析器,XML文档必须遵循DTD定义.同时,他也告诉解析器,到哪里找到文档定义的其余内容.在前边的例子里DOCTYPE很简单: &l ...
- Mybatis xml约束文件的使用
一:准备.DTD约束文件 核心配置文件约束文件:mybatis-config.dtd <?xml version="1.0" encoding="UTF- ...
随机推荐
- SpotLight的下载地址以及注册码可供参考
ToadDBASuiteforOracle_101R2.exe 试用版http://worlddownloads.quest.com.edgesuite.net/Repository/www.ques ...
- [翻译]15个最常见的WCF面试问题
WCF和ASMX WebService的区别是什么? 最基本的区别在于,ASMX或者ASP.NET WebService是用来通过基于HTTP的SOAP来实现通讯.但WCF可以使用任意协议(HTTP, ...
- android studio 打开github开源代码
1.最近下载的开源代码全是github来的,一直用eclipse开发,对于android studio来说是全新的 2.在eclipse导入一个工程那是so easy, import选择一下就可以. ...
- Oracle设置表只读-alter table xxx read only
11g以前,当需要设置一个表只读时,我们通过赋予某些用户select权限.但对于表的owner来说,还是可以读写的. 从Oracle 11g开始,我们可以通过一下命令设置表只读或可读可写: alter ...
- Windows 7下载
原版的ISO:windows 7 旗舰版:32位: ed2k://|file|cn_windows_7_ultimate_x86_dvd_x15-65907.iso|2604238848|D6F139 ...
- Linux学习笔记(5)-进程管理
进程简介 进程是正在执行的一个程序或命令,每一个进程都有自己的地址空间,并占有一定的系统资源.感性的认识,进程就是一个正在运行的程序 进程管理的作用 判断服务器的运行状态 查看系统中有哪些进程 杀死进 ...
- 认识OD的两种断点
OllyDBG从原理上来区分,有两种不同的断点:软件断点和硬件断点. 也许会有朋友说那不是还有内存断点吗? 内存断点严格来说是属于一种特殊的软件断点. 内存断点: 内存断点每次只能设置一个,假如你设置 ...
- 常用汇编命令&&OD命令总结
汇编32位CPU所含有的寄存器有: 4个数据寄存器(EAX.EBX.ECX和EDX)对低16位数据的存取,不会影响高16位的数据.这些低16位寄存器分别命名为:AX.BX.CX和DX,它和先前的CPU ...
- c++中的隐藏、重载、覆盖(重写)
转自c++中的隐藏.重载.覆盖(重写) 1 重载与覆盖 成员函数被重载的特征: (1)相同的范围(在同一个类中): (2)函数名字相同: (3)参数不同: (4)virtual关键字可有可无. 覆盖是 ...
- 结构型—桥接(Bridge)模式
1.意图: 将抽象部分(抽象接口)与它的实现部分(代码实现)分离,使它们都可以独立地变化. 理解:抽象部分是对外展现的接口(api),而实现部分是针对抽象接口提供的不同版本的功能实现,使两者独立变化指 ...