xml之dtd介绍
原创
©著作权归作者所有:来自51CTO博客作者风中木偶的原创作品,请联系作者获取转载授权,否则将追究法律责任
为什么需要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. 引用实体
举例说明:
在dtd中定义:
<!ELEMENT 班级 (学生+,班长?)>
<!--定义一个引用实体,建议大家把引用实体的定义放在前面-->
<!ENTITY intro "这是一个介绍">
在xml文件中引用:
<介绍>&intro;学习刻苦</介绍>
运行该xml文件时,此处显示:
<介绍>这是一个介绍学习刻苦</介绍>
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>