为什么需要dtd:
dtd的主要用处是约束xml文件,也可去约束html、html...
快速入门:
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>
① 本地引用
<!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 [实体]
属性的特点
#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. 引用实体
举例说明:
在dtd中定义:
<!ELEMENT 班级 (学生+,班长?)>
<!--定义一个引用实体,建议大家把引用实体的定义放在前面-->
<!ENTITY intro "这是一个介绍">
在xml文件中引用:
<介绍>&intro;学习刻苦</介绍>
<介绍>这是一个介绍学习刻苦</介绍>
2. 参数实体
举例:
<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>原文链接:https://www.f2er.com/xml/295941.html