XML——XML文件约束之DTD详解

来源:互联网 发布:黑页源码带音乐 编辑:程序博客网 时间:2024/05/18 19:43

我们编写文档来约束一个XML文档的书写规范,这称之为XML约束。

常用的约束技术有:

  • XML DTD
  • XML Schema

DTD的基本概念:

document type definition 文档类型定义

DTD文件一般和XML文件配合使用,主要是为了约束XML文件。

XML文件引入DTD文件,这样XML可以自定义标签,但又受到DTD文件的约束。比如上一节使用XML描述一个班级的信息,如果我们给每一个学生定义一个<面积>标签,语法上也是没有错误的,但是不符合语义,学生怎么能够用面积来描述呢?这时候我们就需要用到DTD文件来约束这个XML。

<code class="language-xml hljs  has-numbering"><span class="hljs-pi"><?xml version="1.0" encoding="gb2312"?></span><span class="hljs-tag"><<span class="hljs-title">class</span>></span>    <span class="hljs-tag"><<span class="hljs-title">stu</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">"001"</span>></span>        <span class="hljs-tag"><<span class="hljs-title">name</span>></span>杨过<span class="hljs-tag"></<span class="hljs-title">name</span>></span>         <span class="hljs-tag"><<span class="hljs-title">sex</span>></span>男<span class="hljs-tag"></<span class="hljs-title">sex</span>></span>        <span class="hljs-tag"><<span class="hljs-title">age</span>></span>20<span class="hljs-tag"></<span class="hljs-title">age</span>></span>        <span class="hljs-tag"><<span class="hljs-title">面积</span>></span>100<span class="hljs-tag"></<span class="hljs-title">面积</span>></span>    <span class="hljs-tag"></<span class="hljs-title">stu</span>></span><span class="hljs-tag"></<span class="hljs-title">class</span>></span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li></ul>

1.1 DTD约束快速入门案例

基本语法:

<code class="language-dtd hljs xml has-numbering"><span class="hljs-tag"><<span class="hljs-title">!ELEMENT</span> 元素名 类型></span></code><ul style="" class="pre-numbering"><li>1</li></ul>

我们还以班级为例,编写如下DTD文件,myClass.dtd:

<code class="language-xml hljs  has-numbering"><span class="hljs-tag"><<span class="hljs-title">!ELEMENT</span> 班级 (学生+)></span><span class="hljs-tag"><<span class="hljs-title">!ELEMENT</span> 学生 (名字,年龄,介绍)></span><span class="hljs-tag"><<span class="hljs-title">!ELEMENT</span> 名字 (#<span class="hljs-attribute">PCDATA</span>)></span><span class="hljs-tag"><<span class="hljs-title">!ELEMENT</span> 年龄 (#<span class="hljs-attribute">PCDATA</span>)></span><span class="hljs-tag"><<span class="hljs-title">!ELEMENT</span> 介绍 (#<span class="hljs-attribute">PCDATA</span>)></span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul>

第一行表示根元素为班级,并且有学生这个子元素,子元素为1或者多个。
第二行表示学生的子元素为名字,年龄,介绍
名字下面没有子元素了,那么#PCDATA表示名字里面可以放任意文本。
年龄和介绍也是类似。

编写myClass.xml文件并引入DTD文件如下:

<code class="language-xml hljs  has-numbering"><span class="hljs-pi"><?xml version="1.0" encoding="utf-8"?></span><span class="hljs-comment"><!--引入dtd文件,约束这个xml--></span><span class="hljs-doctype"><!DOCTYPE 班级 SYSTEM "myClass.dtd"></span><span class="hljs-tag"><<span class="hljs-title">班级</span>></span>    <span class="hljs-tag"><<span class="hljs-title">学生</span>></span>        <span class="hljs-tag"><<span class="hljs-title">名字</span>></span>周小星<span class="hljs-tag"></<span class="hljs-title">名字</span>></span>            <span class="hljs-tag"><<span class="hljs-title">年龄</span>></span>23<span class="hljs-tag"></<span class="hljs-title">年龄</span>></span>        <span class="hljs-tag"><<span class="hljs-title">介绍</span>></span>学习刻苦<span class="hljs-tag"></<span class="hljs-title">介绍</span>></span>    <span class="hljs-tag"></<span class="hljs-title">学生</span>></span>       <span class="hljs-tag"><<span class="hljs-title">学生</span>></span>        <span class="hljs-tag"><<span class="hljs-title">名字</span>></span>林晓<span class="hljs-tag"></<span class="hljs-title">名字</span>></span>         <span class="hljs-tag"><<span class="hljs-title">年龄</span>></span>25<span class="hljs-tag"></<span class="hljs-title">年龄</span>></span>        <span class="hljs-tag"><<span class="hljs-title">介绍</span>></span>是一个好学生<span class="hljs-tag"></<span class="hljs-title">介绍</span>></span>    <span class="hljs-tag"></<span class="hljs-title">学生</span>></span>   <span class="hljs-tag"></<span class="hljs-title">班级</span>></span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li></ul>

引入中写的:SYSTEM,表示当前的DTD文件是本地的
如果写的是PUBLIC,则表示引入的DTD文件是来自于网络的.

这时候引入的DTD文件是没有产生作用的,如果我们在学生元素中添加子元素<面积>,打开这个XML文件,浏览器依然不会报错。

<code class="language-xml hljs  has-numbering"><span class="hljs-pi"><?xml version="1.0" encoding="utf-8"?></span><span class="hljs-comment"><!--引入dtd文件,约束这个xml--></span><span class="hljs-doctype"><!DOCTYPE 班级 SYSTEM "myClass.dtd"></span><span class="hljs-tag"><<span class="hljs-title">班级</span>></span>    <span class="hljs-tag"><<span class="hljs-title">学生</span>></span>        <span class="hljs-tag"><<span class="hljs-title">名字</span>></span>周小星<span class="hljs-tag"></<span class="hljs-title">名字</span>></span>            <span class="hljs-tag"><<span class="hljs-title">年龄</span>></span>23<span class="hljs-tag"></<span class="hljs-title">年龄</span>></span>        <span class="hljs-tag"><<span class="hljs-title">介绍</span>></span>学习刻苦<span class="hljs-tag"></<span class="hljs-title">介绍</span>></span>        <span class="hljs-tag"><<span class="hljs-title">面积</span>></span>100平米<span class="hljs-tag"></<span class="hljs-title">面积</span>></span>    <span class="hljs-tag"></<span class="hljs-title">学生</span>></span>       <span class="hljs-tag"><<span class="hljs-title">学生</span>></span>        <span class="hljs-tag"><<span class="hljs-title">名字</span>></span>林晓<span class="hljs-tag"></<span class="hljs-title">名字</span>></span>         <span class="hljs-tag"><<span class="hljs-title">年龄</span>></span>25<span class="hljs-tag"></<span class="hljs-title">年龄</span>></span>        <span class="hljs-tag"><<span class="hljs-title">介绍</span>></span>是一个好学生<span class="hljs-tag"></<span class="hljs-title">介绍</span>></span>    <span class="hljs-tag"></<span class="hljs-title">学生</span>></span>   <span class="hljs-tag"></<span class="hljs-title">班级</span>></span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li></ul>

我们需要编程校验XML文档的正确性

IE5以上的浏览器内置了XML解析工具:Microsoft.XMLDOM,开发人员可以编写JavaScript代码,利用这个解析工具装载XML文件,并对XML文件进行DTD验证。

我们编写myXmlTools.html来对这个XML进行校验,如下:

<code class="language-html hljs  has-numbering"><span class="hljs-tag"><<span class="hljs-title">html</span>></span>    <span class="hljs-tag"><<span class="hljs-title">head</span>></span>    <span class="hljs-comment"><!--自己编写一个简单的解析工具,去解析XML DTD是否配套--></span>         <span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">language</span>=<span class="hljs-value">"javascript"</span>></span><span class="javascript">        <span class="hljs-comment">// 创建xml文档解析器对象</span>        <span class="hljs-keyword">var</span> xmldoc = <span class="hljs-keyword">new</span> ActiveXObject(<span class="hljs-string">"Microsoft.XMLDOM"</span>);        <span class="hljs-comment">// 开启xml校验</span>        xmldoc.validateOnParse = <span class="hljs-string">"true"</span>;        <span class="hljs-comment">// 装载xml文档,即指定校验哪个XML文件</span>        xmldoc.load(<span class="hljs-string">"myClass.xml"</span>);        document.writeln(<span class="hljs-string">"错误信息:"</span>+xmldoc.parseError.reason+<span class="hljs-string">"<br>"</span>);        document.writeln(<span class="hljs-string">"错误行号:"</span>+xmldoc.parseError.line);    </span><span class="hljs-tag"></<span class="hljs-title">script</span>></span>    <span class="hljs-tag"></<span class="hljs-title">head</span>></span>    <span class="hljs-tag"><<span class="hljs-title">body</span>></span>    <span class="hljs-tag"></<span class="hljs-title">body</span>></span><span class="hljs-tag"></<span class="hljs-title">html</span>></span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li></ul>

用IE浏览器打开这个html文件,可以看到运行结果:

XML文件校验

可以看到第9行正是我们添加的<面积>这一行。

2.DTD细节

2.1 DTD文档的声明及引用

1.内部DTD文档

<code class="language-xml hljs  has-numbering"><span class="hljs-doctype"><!DOCTYPE 根元素 [定义内容]></span></code><ul style="" class="pre-numbering"><li>1</li></ul>

2.外部DTD文档

引入外部的DTD文档分为两种:

(1)当引用的DTD文件是本地文件的时候,用SYSTEM标识,并写上”DTD的文件路径”,如下:

<code class="language-xml hljs  has-numbering"><span class="hljs-doctype"><!DOCTYPE 根元素 SYSTEM "DTD文件路径"></span></code><ul style="" class="pre-numbering"><li>1</li></ul>

(2)如果引用的DTD文件是一个公共的文件时,采用PUBLIC标识,如下方式:

<code class="language-xml hljs  has-numbering"><span class="hljs-doctype"><!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文件的URL"></span></code><ul style="" class="pre-numbering"><li>1</li></ul>

比如下例:

<code class="language-xml hljs  has-numbering"><span class="hljs-doctype"><!DOCTYPE web-app PUBLIC "-//Sun Microsystems,Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"></span></code><ul style="" class="pre-numbering"><li>1</li></ul>

2.2 DTD基本语法:

<code class="language-xml hljs  has-numbering"><span class="hljs-tag"><<span class="hljs-title">!ELEMENT</span> <span class="hljs-attribute">NAME</span> <span class="hljs-attribute">CONTENT</span>></span></code><ul style="" class="pre-numbering"><li>1</li></ul>

其中:
- ELEMENT是关键字,是不能修改的
- NAME表示元素名称
- CONTENT是元素类型,必须要大写!CONTENT的内容有三种写法:

(1)EMPTY——表示该元素不能包含子元素和文本,但可以有属性。
(2)ANY——表示该元素可以包含任何在该DTD中定义的元素内容
(3)#PCDATA——可以包含任何字符数据,但是不能在其中包含任何子元素

2.3 DTD元素的组合类型:

DTD中这样规定:

<code class="language-xml hljs  has-numbering"><span class="hljs-tag"><<span class="hljs-title">!ELEMENT</span> 家庭(人+,家电*)></span></code><ul style="" class="pre-numbering"><li>1</li></ul>

这个DTD规定了家庭元素中可以有1到多个”人”这个子元素,也可以有0到多个”家电”这个子元素。其中的加号”+”和星号”*”的含义与正则表达式中的含义一致。

XML这样写:

<code class="language-xml hljs  has-numbering"><span class="hljs-tag"><<span class="hljs-title">家庭</span>></span>    <span class="hljs-tag"><<span class="hljs-title">人</span> 名字=<span class="hljs-value">"张晓明"</span> 性别=<span class="hljs-value">"男"</span> 年龄=<span class="hljs-value">"25"</span>/></span>    <span class="hljs-tag"><<span class="hljs-title">人</span> 名字=<span class="hljs-value">"李小钢"</span> 性别=<span class="hljs-value">"男"</span> 年龄=<span class="hljs-value">"36"</span> 爱好=<span class="hljs-value">"作个教育家和伟人"</span>/></span>    <span class="hljs-tag"><<span class="hljs-title">家电</span> 名称=<span class="hljs-value">"彩电"</span> 数量=<span class="hljs-value">"3"</span>/></span><span class="hljs-tag"></<span class="hljs-title">家庭</span>></span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul>

关于组合类型,有下述的的修饰符可以使用:

符号用途示例示例说明()用来给元素分组(古龙|金庸),(王朔|余杰)分成两组|在列出的对象中选择一个(男人|女人)表示男人或者女人必须出现,两者至少选其一+该对象必须出现一次或者多次(成员+)表示成员必须出现,而却可以出现多个成员*该对象允许出现0次或者多次(爱好*)爱好可以出现两次到多次?该对象必须出现0次或者1次(菜鸟?)菜鸟可以出现,也可以不出现,如果出现的话,最多只能出现一次,对象必须按指定的顺序出现(西瓜,苹果,香蕉)表示西瓜、苹果、香蕉必须出现,并且按这个顺序出现

2.4 属性定义

DTD中属性的定义是这样的:

<code class="language-xml hljs  has-numbering"><span class="hljs-tag"><<span class="hljs-title">!ATTLIST</span> 元素名称    属性名称 类型 属性特点    属性名称 类型 属性特点<span class="hljs-attribute">......</span>  ></span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul>

其中,属性的类型有下面5种:

(1) CDATA
(2) ID
(3) IDREF/IDREFS
(4) Enumerated
(5) ENTITY/ENTITIES

属性的特点有如下4种:

(1) #REQUIRED,表示这个属性必须给,不给就报错
(2) #IMPLIED,表示这个属性可以给也可以不给
(3) #FIXED value,表示这个属性必须给一个固定的value值
(4) Default value,表示这个属性如果没有值,就分配一个默认的value值

比如,我们想在学生这个子元素上加上地址这个属性,而且这个属性是必须的,示例如下:

<code class="language-xml hljs  has-numbering"><span class="hljs-pi"><?xml version="1.0" encoding="utf-8"?></span><span class="hljs-doctype"><!DOCTYPE 班级 SYSTEM "myClass.dtd"></span><span class="hljs-tag"><<span class="hljs-title">班级</span>></span>    <span class="hljs-tag"><<span class="hljs-title">学生</span> 地址=<span class="hljs-value">"香港"</span>></span>        <span class="hljs-tag"><<span class="hljs-title">名字</span>></span>周小星<span class="hljs-tag"></<span class="hljs-title">名字</span>></span>            <span class="hljs-tag"><<span class="hljs-title">年龄</span>></span>23<span class="hljs-tag"></<span class="hljs-title">年龄</span>></span>        <span class="hljs-tag"><<span class="hljs-title">介绍</span>></span>学习刻苦<span class="hljs-tag"></<span class="hljs-title">介绍</span>></span>    <span class="hljs-tag"></<span class="hljs-title">学生</span>></span>       <span class="hljs-tag"><<span class="hljs-title">学生</span> 地址=<span class="hljs-value">"澳门"</span>></span>        <span class="hljs-tag"><<span class="hljs-title">名字</span>></span>林晓<span class="hljs-tag"></<span class="hljs-title">名字</span>></span>         <span class="hljs-tag"><<span class="hljs-title">年龄</span>></span>25<span class="hljs-tag"></<span class="hljs-title">年龄</span>></span>        <span class="hljs-tag"><<span class="hljs-title">介绍</span>></span>是一个好学生<span class="hljs-tag"></<span class="hljs-title">介绍</span>></span>    <span class="hljs-tag"></<span class="hljs-title">学生</span>></span>   <span class="hljs-tag"></<span class="hljs-title">班级</span>></span>       </code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li></ul>

这个时候相应的DTD文件也要更新,不然就会报错,如下:

<code class="language-xml hljs  has-numbering"><span class="hljs-tag"><<span class="hljs-title">!ELEMENT</span> 班级 (学生+)></span><span class="hljs-tag"><<span class="hljs-title">!ELEMENT</span> 学生 (名字,年龄,介绍)></span><span class="hljs-tag"><<span class="hljs-title">!ATTLIST</span> 学生    地址 <span class="hljs-attribute">CDATA</span> #<span class="hljs-attribute">REQUIRED</span>></span><span class="hljs-tag"><<span class="hljs-title">!ELEMENT</span> 名字 (#<span class="hljs-attribute">PCDATA</span>)></span><span class="hljs-tag"><<span class="hljs-title">!ELEMENT</span> 年龄 (#<span class="hljs-attribute">PCDATA</span>)></span><span class="hljs-tag"><<span class="hljs-title">!ELEMENT</span> 介绍 (#<span class="hljs-attribute">PCDATA</span>)></span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li></ul>

2.4.1 对于属性类型的详细解释

(1)属性类型-CDATA,表示属性值可以是任何字符(包括中文和数字)

<code class="language-xml hljs  has-numbering"><span class="hljs-tag"><<span class="hljs-title">!ATTLIST</span> 木偶    姓名 <span class="hljs-attribute">CDATA</span> #<span class="hljs-attribute">REQUIRED</span>></span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul>
<code class="language-xml hljs  has-numbering"><span class="hljs-tag"><<span class="hljs-title">木偶</span> 姓名=<span class="hljs-value">"匹诺曹"</span>/></span><span class="hljs-tag"><<span class="hljs-title">木偶</span> 姓名=<span class="hljs-value">"PiNuocao"</span>/></span><span class="hljs-tag"><<span class="hljs-title">木偶</span> 姓名=<span class="hljs-value">"123"</span>/></span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul>

(2)属性类型-ID,表明该属性的取值必须是唯一的,但是属性的值不能是以数字开头!

<code class="language-xml hljs  has-numbering"><span class="hljs-tag"><<span class="hljs-title">!ELEMENT</span> 公司职员 <span class="hljs-attribute">ANY</span>></span><span class="hljs-tag"><<span class="hljs-title">!ATTLIST</span> 公司职员    编号 <span class="hljs-attribute">ID</span> #<span class="hljs-attribute">REQUIRED</span>    姓名 <span class="hljs-attribute">CDATA</span> #<span class="hljs-attribute">REQUIRED</span>></span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul>
<code class="language-xml hljs  has-numbering"><span class="hljs-tag"><<span class="hljs-title">公司职员</span> 编号=<span class="hljs-value">"Z001"</span> 姓名=<span class="hljs-value">"张三"</span>/></span><span class="hljs-tag"><<span class="hljs-title">公司职员</span> 编号=<span class="hljs-value">"Z002"</span> 姓名=<span class="hljs-value">"李思"</span>/></span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li></ul>

(3)属性类型-IDREF/IDREFS
- IDREF属性的值指向文档中其它地方声明的ID类型的值
- IDREFS同IDREF,但是可以具有由空格分开的多个引用。

<code class="language-xml hljs  has-numbering"><span class="hljs-tag"><<span class="hljs-title">!ELEMENT</span> 家庭(人+)></span><span class="hljs-tag"><<span class="hljs-title">!ELEMENT</span> 人 <span class="hljs-attribute">EMPTY</span>></span><span class="hljs-tag"><<span class="hljs-title">!ATTLIST</span> 人    <span class="hljs-attribute">relID</span> <span class="hljs-attribute">ID</span> #<span class="hljs-attribute">REQUIRED</span>    <span class="hljs-attribute">paraentID</span> <span class="hljs-attribute">IDREFS</span> #<span class="hljs-attribute">IMPLIED</span>    <span class="hljs-attribute">name</span> <span class="hljs-attribute">CDATA</span> #<span class="hljs-attribute">REQUIRED</span>></span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul>
<code class="language-xml hljs  has-numbering"><span class="hljs-tag"><<span class="hljs-title">家庭</span>></span>    <span class="hljs-tag"><<span class="hljs-title">人</span> <span class="hljs-attribute">relID</span>=<span class="hljs-value">"P_1"</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"爸爸"</span>/></span>    <span class="hljs-tag"><<span class="hljs-title">人</span> <span class="hljs-attribute">relID</span>=<span class="hljs-value">"P_2"</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"妈妈"</span>/></span>    <span class="hljs-tag"><<span class="hljs-title">人</span> <span class="hljs-attribute">relID</span>=<span class="hljs-value">"P_3"</span> <span class="hljs-attribute">parentID</span>=<span class="hljs-value">"P_1 P_2"</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"儿子"</span>/></span><span class="hljs-tag"></<span class="hljs-title">家庭</span>></span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul>

(4)属性类型-Enumerated,事先定义好一些值,属性的值必须在所列出的值的范围内。

<code class="language-xml hljs  has-numbering"><span class="hljs-tag"><<span class="hljs-title">!ATTLIST</span> <span class="hljs-attribute">person</span>    婚姻状态 (<span class="hljs-attribute">single</span>|<span class="hljs-attribute">married</span>|<span class="hljs-attribute">divorced</span>|<span class="hljs-attribute">widowed</span>) #<span class="hljs-attribute">IMPLIED</span>></span><span class="hljs-tag"><<span class="hljs-title">!ATTLIST</span> <span class="hljs-attribute">person</span>    性别 (男|女) #<span class="hljs-attribute">REQUIRED</span>></span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul>

(5)属性类型-ENTITY,实体

实体定义:
- 实体用于为一段内容创建一个别名,以后在XML文档中就可以使用别名引用这段内容了。
- 在DTD定义中,一条!ENTITY语句用于定义一个实体。
- 实体可分为两种类型:引用实体和参数实体。引用实体是被XML文档应用的,而参数实体是被DTD文件本身应用的。

①引用实体:

  • 引用实体主要在XML文档中被应用
    语法格式如下,引用实体的定义内容最好放在DTD文件的最后。
<code class="language-xml hljs  has-numbering"><span class="hljs-tag"><<span class="hljs-title">!ENTITY</span> 实体名称 "实体内容"></span></code><ul style="" class="pre-numbering"><li>1</li></ul>

引用方式:&实体名称; 末尾要带上分号,这个引用将直接转变成实体内容

举例如下:

<code class="language-xml hljs  has-numbering"><span class="hljs-tag"><<span class="hljs-title">!ENTITY</span> <span class="hljs-attribute">copyright</span> "<span class="hljs-attribute">I</span> <span class="hljs-attribute">am</span> <span class="hljs-attribute">a</span> <span class="hljs-attribute">programmer</span>"></span>....&copyright;</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul>

②参数实体:

参数实体被DTD文件自身使用
语法格式为:

<code class="language-xml hljs  has-numbering"><span class="hljs-tag"><<span class="hljs-title">!ENTITY</span> % 实体名称 "实体内容"></span></code><ul style="" class="pre-numbering"><li>1</li></ul>

引用方式为:%实体名称

举例:

<code class="language-xml hljs  has-numbering"><span class="hljs-tag"><<span class="hljs-title">!ENTITY</span> % <span class="hljs-attribute">TAG_NAME</span> "姓名|<span class="hljs-attribute">EMAIL</span>|电话|地址"></span><span class="hljs-tag"><<span class="hljs-title">!ELEMENT</span> 个人信息 (%<span class="hljs-attribute">TAG_NAME</span>;|生日)></span><span class="hljs-tag"><<span class="hljs-title">!ELEMENT</span> 客户信息 (%<span class="hljs-attribute">TAG_NAME</span>;|公司名)></span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul>

3.DTD实际案例

学习DTD的目标在于:
(1)要求我们能够看得懂DTD文件,
(2)我们可以根据给出的DTD写出对应的XML文件

下面我们看一个案例,下述的DTD文件是从W3School在线教程中的DTD案例中拿过来的,细看每一行,我们都应该能够看得懂。

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

然后我们可以根据该DTD编写如下最简单的XML文件:

<code class="language-xml hljs  has-numbering"><span class="hljs-pi"><?xml version="1.0" encoding="utf-8"?></span><span class="hljs-doctype"><!DOCTYPE CATALOG SYSTEM "product.dtd"></span><span class="hljs-tag"><<span class="hljs-title">CATALOG</span>></span>    <span class="hljs-tag"><<span class="hljs-title">PRODUCT</span> <span class="hljs-attribute">NAME</span>=<span class="hljs-value">"康帅傅矿泉水"</span> <span class="hljs-attribute">CATEGORY</span>=<span class="hljs-value">"Table"</span> <span class="hljs-attribute">PARTNUM</span>=<span class="hljs-value">"12"</span> <span class="hljs-attribute">PLANT</span>=<span class="hljs-value">"Chicago"</span>></span>        <span class="hljs-tag"><<span class="hljs-title">SPECIFICATIONS</span> <span class="hljs-attribute">WEIGHT</span>=<span class="hljs-value">"20"</span> <span class="hljs-attribute">POWER</span>=<span class="hljs-value">"18"</span>></span>这里是细节<span class="hljs-tag"></<span class="hljs-title">SPECIFICATIONS</span>></span>        <span class="hljs-tag"><<span class="hljs-title">PRICE</span>></span>25<span class="hljs-tag"></<span class="hljs-title">PRICE</span>></span>        <span class="hljs-tag"><<span class="hljs-title">PRICE</span>></span>28<span class="hljs-tag"></<span class="hljs-title">PRICE</span>></span>    <span class="hljs-tag"></<span class="hljs-title">PRODUCT</span>></span><span class="hljs-tag"></<span class="hljs-title">CATALOG</span>></span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li></ul>

然后我们用Microsoft.XMLDOM校验该XML,会发现没有任何错误。但是要注意编码。

0 0
原创粉丝点击