为什么需要dtd:

dtd的主要用处是约束xml文件,也可去约束html、html...

快速入门:

在xml文件中引入dtd约束文件

classes2.xml

<span style="font-size:18px;"><?xmlversion="1.0" encoding="utf-8"?>
<!--一定保证文件的保存的编码方式和 utf-8一致-->
<!--引入dtd-->
<!DOCTYPE班级 SYSTEM "classes2.dtd">
<班级>
<学生>
<名字>周星驰</名字>
<年龄>23</年龄>
<介绍>学习刻苦</介绍>
<面积>20</面积>
</学生>
<学生>
<名字>林青霞</名字>
<年龄>32</年龄>
<介绍>是一个好学生</介绍>
</学生>
</班级></span>


 dtd文件如下:

classes2.dtd

<span style="font-size:18px;"><!ELEMENT 班级 (学生+)>
<!ELEMENT 学生 (名字,年龄,介绍)>
<!ELEMENT 名字 (#PCDATA)>
<!ELEMENT 年龄 (#PCDATA)>
<!ELEMENT 介绍 (#PCDATA)></span>


☞ 在默认情况下,浏览器不会去检测dtd约束条件.,我们需要自己写代码测试(这里有点新知识js),自己写一个测试工具文件

 checkDTD.html

<span style="font-size:18px;"><html>
<head>
<metahttp-equiv="content-type"content="text/html;charset=utf-8"/>
<scriptlanguage="javascript">
<!--
//创建一个xml解析器
var xmldoc = newActiveXObject("Microsoft.XMLDOM");
//开启校验功能
xmldoc.validateOnParse =true;
//指定对哪个 xml文件校验
xmldoc.load("classes2.xml");
//如果有错误信息,则输出
document.write("错误信息="+xmldoc.parseError.reason+"<br/>");
document.write("错误的行号="+xmldoc.parseError.line+"<br/>");
//-->
</script>
</head>
</html></span>

上面是将外部dtd文件引入xml文件中,除此之外,还可以直接在xml文件中写入dtd文件内容,即内部dtd

classes3.xml

<span style="font-size:18px;"><?xmlversion="1.0" encoding="utf-8"?>
<!--一定保证文件的保存的编码方式和 utf-8一致-->
<!--引入dtd-->
<!DOCTYPE 班级 [
<!ELEMENT 班级 (学生+)>
<!ELEMENT 学生 (名字,年龄,介绍)>
<!ELEMENT 名字 (#PCDATA)>
<!ELEMENT 年龄 (#PCDATA)>
<!ELEMENT 介绍 (#PCDATA)>
]>
<班级>
<学生>
<名字>周星驰</名字>
<年龄>23</年龄>
<介绍>学习刻苦</介绍>
</学生>
<学生>
<名字>林青霞</名字>
<年龄>32</年龄>
<介绍>是一个好学生</介绍>
</学生>
</班级></span>


在xml文件中引入dtd文件有两种方式:

①      本地引用

<!DOCTYPE 根元素名 SYSTEM  “被引入的dtd文件的路径”>

②      引入一个公开的dtd(网络中的dtd文件)

<!DOCTYPE 文档根结点 PUBLIC  "DTD名称"  "DTD文件的URL">

dtd的元素说明

基本语法

<!ELEMENT  元素名  元素规范>

元素名有三个规范:

EMPTY-该元素不能包含子元素和文本,但可以有属性-(空元素)

ANY-该元素可以包含任何在DTD中定义的元素内容

#PCDATA-可以包含任何字符数据,但是不能在其中包含任何子元素

其它类型(组合)

我们的元素的几个修饰符

 ?   0到1

 +   1到多

 *   0到多

 |   表示选择

 ,   表示元素出现的顺序

 

dtd元素属性列表说明

基本语法

<!ATTLIST  元素名字

属性名  属性类型  属性的特点

属性名  属性类型  属性的特点

属性类型有:

CDATA           [表示属性值可以是字符或者数字]
ID                 [属性值是唯一的,字母开头 ]
IDREF/IDREFS      [id引用]
Enumerated         [枚举]
ENTITY/ENTITIES  [实体]

属性的特点

#REQUIRED  【该属性必须有】

#IMPLIED     【该属性可以有可以没有】

#FIXED value    [该属性的值是固定值]

DEFAULT value   [默认值]


说明IDREF/ IDREFS的用法:

IDREF    引用一个

IDREFS   引用多个

案例:

<span style="font-size:18px;"><学生 住址="香港" 大佬="a002 a003" 学号="a001">
<名字>周星驰</名字>
<年龄>23</年龄>
<介绍>学习刻苦</介绍>
</学生></span>

对应的dtd

<span style="font-size:18px;"><!ATTLIST 学生
住址 CDATA#IMPLIED
学号 ID#REQUIRED
大佬 IDREFS#REQUIRED
> </span>


实体定义

分为两种

1.      引用实体

 

xml之dtd介绍_xml文件

举例说明:

 

在dtd中定义:

<!ELEMENT 班级 (学生+,班长?)>

<!--定义一个引用实体,建议大家把引用实体的定义放在前面-->

<!ENTITY intro "这是一个介绍">


在xml文件中引用:


<介绍>&intro;学习刻苦</介绍>

 

运行该xml文件时,此处显示:

<介绍>这是一个介绍学习刻苦</介绍>


2.      参数实体

 

xml之dtd介绍_xml_02

 

举例:

<span style="font-size:18px;"><!ELEMENT 班级 (学生+,班长?)>
<!--定义一个引用实体,建议大家把引用实体的定义放在前面-->
<!ENTITY intro "这是一个介绍">
<!--定义一个参数实体-->
<!ENTITY % sName "名字">
<!ATTLIST 学生
住址 CDATA #IMPLIED
学号 ID #REQUIRED
大佬 IDREFS #REQUIRED
婚姻状态 (单身|结婚|离婚) #REQUIRED
国籍 CDATA #FIXED "中国"
>
<!—注意要带分号-->
<!ELEMENT 学生(%sName;,年龄,介绍)>
<!ELEMENT %sName; (#PCDATA)>
<!ELEMENT 年龄(#PCDATA)>
<!ELEMENT 介绍(#PCDATA)>
<!ELEMENT 班长(#PCDATA)></span>

综合练习:

假设项目经理,定义了一个dtd文件.要求我们程序员根据dtd来编写一个合法和符合dtd规范的xml.

myDtd.dtd

<span style="font-size:18px;"><!ENTITY AUTHOR"John Doe">
<!ENTITYCOMPANY "JD Power Tools, Inc.">
<!ENTITY EMAIL"jd@jd-tools.com">

<!ELEMENTCATALOG (PRODUCT+)>

<!ELEMENTPRODUCT
(SPECIFICATIONS+,OPTIONS?,PRICE+,NOTES?)>
<!ATTLISTPRODUCT
NAME CDATA#IMPLIED
CATEGORY(HandTool|Table|Shop-Professional) "HandTool"
PARTNUM CDATA#IMPLIED
PLANT (Pittsburgh|Milwaukee|Chicago)"Chicago"
INVENTORY(InStock|Backordered|Discontinued) "InStock">

<!ELEMENTSPECIFICATIONS (#PCDATA)>
<!ATTLISTSPECIFICATIONS
WEIGHT CDATA#IMPLIED
POWER CDATA#IMPLIED>

<!ELEMENTOPTIONS (#PCDATA)>
<!ATTLISTOPTIONS
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)></span>

xml文件:

<span style="font-size:18px;"><?xmlversion="1.0" encoding="utf-8"?>
<!DOCTYPECATALOG SYSTEM "products.dtd">
<CATALOG>
<PRODUCTNAME="冰箱" CATEGORY="HandTool"PLANT="Chicago" INVENTORY="Discontinued">
<SPECIFICATIONSWEIGHT="80kg" POWER="1000w">这是国产海尔冰箱</SPECIFICATIONS>
<PRICE>1000</PRICE>
<NOTES>轻拿轻放</NOTES>
</PRODUCT>
</CATALOG></span>