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

1.XML文件束缚与DTD的简单介绍

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

经常使用的束缚技术有:

  • XML DTD
  • XML Schema

DTD的基本概念:

document type definition 文档类型定义

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

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

<?xml version="1.0" encoding="gb2312"?> <class> <stu id="001"> <name>杨过</name> <sex></sex> <age>20</age> <面积>100</面积> </stu> </class>

1.1 DTD束缚快速入门案例

基本语法:

<!ELEMENT 元素名 类型>

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

<!ELEMENT 班级 (学生+)> <!ELEMENT 学生 (名字,年龄,介绍)> <!ELEMENT 名字 (#PCDATA)> <!ELEMENT 年龄 (#PCDATA)> <!ELEMENT 介绍 (#PCDATA)>

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

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

<?xml version="1.0" encoding="utf⑻"?> <!--引入dtd文件,束缚这个xml--> <!DOCTYPE 班级 SYSTEM "myClass.dtd"> <班级> <学生> <名字>周小星</名字> <年龄>23</年龄> <介绍>学习刻苦</介绍> </学生> <学生> <名字>林晓</名字> <年龄>25</年龄> <介绍>是1个好学生</介绍> </学生> </班级>

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

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

<?xml version="1.0" encoding="utf⑻"?> <!--引入dtd文件,束缚这个xml--> <!DOCTYPE 班级 SYSTEM "myClass.dtd"> <班级> <学生> <名字>周小星</名字> <年龄>23</年龄> <介绍>学习刻苦</介绍> <面积>100平米</面积> </学生> <学生> <名字>林晓</名字> <年龄>25</年龄> <介绍>是1个好学生</介绍> </学生> </班级>

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

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

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

<html> <head> <!--自己编写1个简单的解析工具,去解析XML DTD是不是配套--> <script language="javascript"> // 创建xml文档解析器对象 var xmldoc = new ActiveXObject("Microsoft.XMLDOM"); // 开启xml校验 xmldoc.validateOnParse = "true"; // 装载xml文档,即指定校验哪一个XML文件 xmldoc.load("myClass.xml"); document.writeln("毛病信息:"+xmldoc.parseError.reason+"<br>"); document.writeln("毛病行号:"+xmldoc.parseError.line); </script> </head> <body> </body> </html>

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

XML文件校验

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

2.DTD细节

2.1 DTD文档的声明及援用

1.内部DTD文档

<!DOCTYPE 根元素 [定义内容]>

2.外部DTD文档

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

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

<!DOCTYPE 根元素 SYSTEM "DTD文件路径">

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

<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文件的URL">

比以下例:

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems,Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

2.2 DTD基本语法:

<!ELEMENT NAME CONTENT>

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

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

2.3 DTD元素的组合类型:

DTD中这样规定:

<!ELEMENT 家庭(人+,家电*)>

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

XML这样写:

<家庭> < 名字="张晓明" 性别="男" 年龄="25"/> < 名字="李小钢" 性别="男" 年龄="36" 爱好="作个教育家和巨人"/> <家电 名称="彩电" 数量="3"/> </家庭>

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

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

2.4 属性定义

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

<!ATTLIST 元素名称 属性名称 类型 属性特点 属性名称 类型 属性特点...... >

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

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

属性的特点有以下4种:

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

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

<?xml version="1.0" encoding="utf⑻"?> <!DOCTYPE 班级 SYSTEM "myClass.dtd"> <班级> <学生 地址="香港"> <名字>周小星</名字> <年龄>23</年龄> <介绍>学习刻苦</介绍> </学生> <学生 地址="澳门"> <名字>林晓</名字> <年龄>25</年龄> <介绍>是1个好学生</介绍> </学生> </班级>

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

<!ELEMENT 班级 (学生+)> <!ELEMENT 学生 (名字,介绍)> <!ATTLIST 学生 地址 CDATA #REQUIRED > <!ELEMENT 名字 (#PCDATA)> <!ELEMENT 年龄 (#PCDATA)> <!ELEMENT 介绍 (#PCDATA)>

2.4.1 对属性类型的详细解释

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

<!ATTLIST 木偶 姓名 CDATA #REQUIRED >
<木偶 姓名="匹诺曹"/> <木偶 姓名="PiNuocao"/> <木偶 姓名="123"/>

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

<!ELEMENT 公司职员 ANY> <!ATTLIST 公司职员 编号 ID #REQUIRED 姓名 CDATA #REQUIRED >
<公司职员 编号="Z001" 姓名="张3"/> <公司职员 编号="Z002" 姓名="李思"/>

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

<!ELEMENT 家庭(人+)> <!ELEMENTEMPTY> <!ATTLISTrelID ID #REQUIRED paraentID IDREFS #IMPLIED name CDATA #REQUIRED >
<家庭> < relID="P_1" name="爸爸"/> < relID="P_2" name="妈妈"/> < relID="P_3" parentID="P_1 P_2" name="儿子"/> </家庭>

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

<!ATTLIST person 婚姻状态 (single|married|divorced|widowed) #IMPLIED > <!ATTLIST person 性别 (男|女) #REQUIRED >

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

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

①援用实体:

  • 援用实体主要在XML文档中被利用
    语法格式以下,援用实体的定义内容最好放在DTD文件的最后。
<!ENTITY 实体名称 "实体内容">

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

举例以下:

<!ENTITY copyright "I am a programmer"> .... &copyright;

②参数实体:

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

<!ENTITY % 实体名称 "实体内容">

援用方式为:%实体名称

举例:

<!ENTITY % TAG_NAME "姓名|EMAIL|电话|地址"> <!ELEMENT 个人信息 (%TAG_NAME;|生日)> <!ELEMENT 客户信息 (%TAG_NAME;|公司名)>

3.DTD实际案例

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

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

<!ENTITY AUTHOR "John Doe"> <!ENTITY COMPANY "JD Power Tools,Inc."> <!ENTITY EMAIL "jd@jd-tools.com"> <!ELEMENT CATALOG (PRODUCT+)> <!ELEMENT PRODUCT (SPECIFICATIONS+,OPTIONS?,PRICE+,NOTES?)> <!ATTLIST PRODUCT NAME CDATA #IMPLIED CATEGORY (HandTool|Table|Shop-Professional) "HandTool" PARTNUM CDATA #IMPLIED PLANT (Pittsburgh|Milwaukee|Chicago) "Chicago" INVENTORY (InStock|Backordered|Discontinued) "InStock"> <!ELEMENT SPECIFICATIONS (#PCDATA)> <!ATTLIST SPECIFICATIONS WEIGHT CDATA #IMPLIED POWER CDATA #IMPLIED> <!ELEMENT OPTIONS (#PCDATA)> <!ATTLIST OPTIONS FINISH (Metal|Polished|Matte) "Matte" ADAPTER (Included|Optional|NotApplicable) "Included" CASE (HardShell|Soft|NotApplicable) "HardShell"> <!ELEMENT PRICE (#PCDATA)> <!ATTLIST PRICE MSRP CDATA #IMPLIED WHOLESALE CDATA #IMPLIED STREET CDATA #IMPLIED SHIPPING CDATA #IMPLIED> <!ELEMENT NOTES (#PCDATA)>

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

<?xml version="1.0" encoding="utf⑻"?> <!DOCTYPE CATALOG SYSTEM "product.dtd"> <CATALOG> <PRODUCT NAME="康帅傅矿泉水" CATEGORY="Table" PARTNUM="12" PLANT="Chicago"> <SPECIFICATIONS WEIGHT="20" POWER="18">这里是细节</SPECIFICATIONS> <PRICE>25</PRICE> <PRICE>28</PRICE> </PRODUCT> </CATALOG>

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


HTML代码中要想改变字体颜色,常常需要使用CSS样式表。CSS是一门用来描述网页上样式的语言,通过编写CSS代码可以实现网页中各元素的大小、颜色、字体等各种样式的控制。那么如何在HTML代码中应用CSS样式来改变字体颜色呢?这里为大家介绍一下。 首先,在HTML代码...
HTML代码如何让字体盖住图片呢?需要使用CSS的position属性及z-index属性。 img { position: relative; z-index: -1; } p { position: absolute; to...
HTML代码字体设置 在HTML中,我们可以使用标签来设置网页中的文字字体。常用的字体标签是font和style,下面我们来学习如何使用这些标签。 1. font标签 使用font标签可以改变文字的字体、颜色和大小。它有三个属性font-family、color和...
在网页设计中,HTML代码的字体和字号选择是非常重要的一个环节,因为它们直接关系到页面的可读性和视觉效果。 要指定文本的字体和字号,可以使用HTML中的样式属性。使用样式属性设置字体和字号,如下所示: <p style="font-family: Aria...
HTML(Hypertext Markup Language,超文本标记语言)是一种用于创建网页的标准语言。它由许多标签(一对尖括号包围的关键字)组成,这些标签告诉浏览器如何显示内容。使用HTML代码,我们可以轻松地创建各种类型的图像和图形,如太极图。 在HTM...
外链是指在一个网页中添加一个指向其他网站的链接,用户可以通过这个链接直接跳转到其他网站。在HTML中,实现外链的方法很简单,只需要使用标签就可以了。 <a href="http://www.example.com">这是一个外链,点击跳转到www.ex...
HTML代码是实现网页界面的基础,而网页中的各种表单则是用户和网站进行交互的重要方式之一。下面我们来介绍如何使用HTML代码实现一个简单的报名表格。 <form action="submit.php" method="post"> &lt...
HTML是一种标记语言,用于开发网站和其他互联网内容。字体是网站设计中的关键元素之一,它可以决定网站的整体风格和呈现效果。HTML提供了字体编辑器,使网站设计变得更加容易。 <font face="Arial"> 这里是Arial字体 &...
HTML代码中,字体样式是开发者们必备的一部分。在HTML中,我们可以通过特定的标签和属性设置字体的样式、颜色和大小,以达到更好的排版效果。 <p style="font-size: 14px; color: #333; font-family:...
HTML中的字体可以设为粗体,以强调文本信息。我们可以通过使用一些标签来实现这一功能。其中,常用的标签包括: 1. 标签:该标签会把文本加粗显示,语法如下: 这是一段加粗的文本 2. 标签:与标签作用相同,但语义更强,表示该文本内容的重要性。语法如下:...
HTML代码可以实现文件的上传和下载,在网页开发中相当常见。通过使用<input>标签和<form>标签,我们可以轻松创建一个文件上传表单。 <form action="upload.php" method="post" enct...
HTML代码非常常见于网页设计中。在一些需要处理时间相关数据的场景下,可能需要将时间戳转换为实际时间,这时候就需要使用一些特定的HTML代码。 function timeStamp2Time(time){ var date = new Date(time...
HTML是一种用于创建网页的标记语言。在HTML中,我们可以使用超链接标签实现下载文件到本地的功能。 具体实现步骤如下: <a href="文件的URL" download="文件名">下载文件</a> 其中,href属性是文件...
在HTML代码中,对于字体靠左对齐有各种方法。其中最简单的方式之一是使用pre标签。 使用pre标签可以保留一段文本中的空格和换行符,从而使代码排版更加整齐。下面是一个例子: <p>这是一个段落。</p> &lt...
HTML代码字典是一本解释HTML标记和属性的参考文献。这本字典中包含了最常用的HTML代码以及它们的属性和值的详细描述。 例如,以下是HTML代码字典中的一部分内容: <a href="url">link text</a> 在...
在网页开发过程中,遇到一些需要用户复制的内容,我们通常都会提供复制按钮,让用户更方便地复制所需内容。下面我们来介绍如何使用html代码实现一键复制的功能。 var copyBtn = document.querySelector('#copy-bt...
用户登录 欢迎来到公司登录界面,请输入用户名和密码登录 用户名: 密码: 代码解释: 第1行:定义了一个 HTML 文档 第2行:开始了 HTML 头部 第3行:定义了...
HTML 代码是用来创建网页的语言,它包含了许多不同的元素和属性,让我们可以在网页中添加各种不同的元素和内容,如文字、图片、链接等等。在编写 HTML 代码时,我们可以使用各种不同的样式来美化我们的网页,例如更改字体、颜色、大小等等。 font-family:...
HTML代码中的字体转移 在编写HTML代码时,我们经常会使用各种字体来增强页面的可读性和视觉效果。但是,有些字符或特殊符号可能会在HTML中具有不同的含义,这就需要使用字体转义转换成HTML可以正常显示的字符。 在HTML中,使用"&"符号表示一个特殊字符将要被转...
HTML 编程语言中,你可以使用字体属性来更改文本的字体大小、颜色和样式。其中,字体颜色是最常用的样式更改。在 HTML 中,你可以使用 "color" 属性来更改文本的颜色。下面是一个使用 "pre" 标签的代码示例,演示如何使用 "color" 属性来更改字体颜色...