在讲解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预留了几种实体引用::&lt:代表着小于号,&gt;代表着大于号,&amp:代表and符号,&apos;代表英文的单引号,&quot;代表英文的双引号,通过这些内置的实体引用,可以避免文档符号的冲突,保持良好的文档规范。

  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约束文件的更多相关文章

  1. 【转】xml文件中加入本地的dtd约束文件

    首先,我是以加载Struts2的来演示: 1 我们可以看到,越是文件中的 显示的是PUBLIC, 即从网络中获取约束文件dtd ,此时我需要将其配置成从自己的本地来获取dit文件 首先,先要有stru ...

  2. MyEclipse配置Struts2的本地工作空间中的DTD约束文件

    1.拷贝URI http://struts.apache.org/dtds/struts-2.3.dtd 2.配置XML Catalog 3.struts-2.3.dtd文件来源 解压jar包\Web ...

  3. eclipse如何在不联网的情况下引入dtd约束文件

    1. 获取dtd文件,解压 F:\Java配置文件\Mybatis\mybatis-3.3.0\mybatis-3.3.0.jar\org\apache\ibatis\builder\xml\ 路径下 ...

  4. Mybatis:Eclipse引入dtd约束文件使得xml文件有提示

    https://blog.csdn.net/lsx2017/article/details/82558135

  5. 作业:xml练习2-写.xml的外部约束文件(dtd文件)

    写外部DTD: 步骤: 1.在srd目录下新建DTD文件,并命名为:scores.dtd 2.在练习1的基础上,剪切练习1的DTD内部声明.粘贴到一个新建的DTD文件中.剪切之后的地方换上:包含外部D ...

  6. Eclipse引入自定义XML约束文件(DTD,SCHEMA)问题

    Eclipse引入自定义XML约束文件(DTD,SCHEMA)问题 1:说明 使用Eclipse 编写xml文件的约束文件的,包括DTD约束文件,Schema约束文件的时候, 我们也需要接受eclip ...

  7. DTD约束的校验工具安装及检验(Iexmltls工具)

    通过打开我们写的dtd约束文档,我们可以看到,在我们不按规定的格式打开xml时并不能检验出错误.此时我们可以借助软件来帮助我们校验. Iexmltls是一个在IE浏览器下安装的用于检验xml约束是否正 ...

  8. DTD约束简介

    DTD约束简介 文档类型声明 文档类型声明就是DOCTYPE,它告诉解析器,XML文档必须遵循DTD定义.同时,他也告诉解析器,到哪里找到文档定义的其余内容.在前边的例子里DOCTYPE很简单: &l ...

  9. Mybatis xml约束文件的使用

    一:准备.DTD约束文件      核心配置文件约束文件:mybatis-config.dtd <?xml version="1.0" encoding="UTF- ...

随机推荐

  1. php取整的几种方法

    php取整的几种方式. floor 舍去法取整 语法格式:float floor ( float value )返回不大于value 的下一个整数,将value 的小数部分舍去取整.floor() 返 ...

  2. html 元素添加 class

    <!-- 给 input 添加 class 一个input 可以添加多个class 中间空格隔开. --> @Html.TextBox("txtIDNumber", & ...

  3. python装饰器总结

    一.装饰器是什么 python的装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.简单的说装饰器就是一个用来返回函数的函数 ...

  4. proguardgui.bat来混淆已有的jar包

    1.U:\android-sdk\tools\proguard\bin\找到 proguardgui.bat,双击就可以弹出一个混淆的界面 2.加入不要混淆的,比如我们用的系统的,还有别人的jar 3 ...

  5. Android的ProgressBar以及自定义进度条

    1.xml文件 activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/an ...

  6. C# 白话系列之——白话委托

    今天看到首页有个委托的文章,但大都写的太专业,而且没有实用的例子场景.正好昨天做了一个有关委托的功能,所以也来凑个热闹,用白话掰掰 一.委托是什么 我们都知道数据类型,简单点的如,想给一个变量赋值整数 ...

  7. 【NHibernate】应用层面需要掌握的知识汇总

    休息接待区 欢迎加入NHibernate中文社区!在讨论中寻找乐趣!在问题中寻找答案! 旅途站点路线 第一站:熟悉NHibernate NHibernate之旅(1):开篇有益 第二站:接触NHibe ...

  8. sql表连接left join,right join,inner join三者之间的区别

    sql表连接left join,right join,inner join区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 (以左表数据为基准,不足补为NULL) ...

  9. 使用 Android Studio 跑新浪微博SDK Demo遇到的问题及解决

    概述 这是新浪微博官方 Android SDK Demo 使用 Android Studio 导入.编译并运行通过的版本. 源码:WeiboSdkDemo 官方项目请点击: weibo_android ...

  10. 如何修改SVN中的用户名和密码

    删除掉C:\Users\Administrator\Application Data\Subversion\auth\svn.simple文件夹下的文件即可.再次访问时,会弹出要求输入用户名和密码. ...