dtd
基本概念: dtd ( document type definition 文档类型定义),该文件一般和xml文件配合使用, 主要的用处是约束 xml.
除了 dtd 技术外, 还有一个schema的技术也可以用于约束xml文件的书写规范.
现在请看一个问题:
<stu id="a"0'0'1<" > <name>杨过</name> <sex>男</sex> <age>30</age> <介绍>我是好人</介绍> <面积>100平</面积> </stu>
xml过于自由。
快速入门案例
基本语法是:
<!ELEMENT 元素名 类型>
<?xml version="1.0" encoding="utf-8"?> <!--引入dtd去约束该xml文件--> <!DOCTYPE 班级 SYSTEM "myClass2.dtd"> <班级> <学生> <名字>周星驰</名字> <年龄>23</年龄> <介绍>学习刻苦</介绍> </学生> <学生> <名字>林青霞</名字> <年龄>32</年龄> <介绍>是一个好学生</介绍> </学生> </班级>
myClass2.dtd <!ELEMENT 班级 (学生+)> <!ELEMENT 学生 (名字,年龄,介绍)> <!ELEMENT 名字 (#PCDATA)> <!ELEMENT 年龄 (#PCDATA)> <!ELEMENT 介绍 (#PCDATA)>
完成校验的html编写
<html> <head> <!--自己编写一个简单的解析工具,去解析xml dtd 是否配套--> <script language="javascript"> <!-- var xmldoc = new ActiveXObject("Microsoft.XMLDOM"); xmldoc.validateOnParse = "true";//开启校验 xmldoc.load("myClass2.xml");//指定校验哪个xml文件 document.writeln("错误信息是:"+xmldoc.parseError.reason+"<br/>"); document.writeln("错误的行是:"+xmldoc.parseError.line); //--> </script> </head> <body> </body> </html>
dtd的细节
(1) dtd 的分类
内部 dtd
外部 dtd
内部DTD文档: <!DOCTYPE 根元素 [定义内容]>
外部DTD文档: <!DOCTYPE 根元素 SYSTEM "DTD文件路径">
(2) 在xml中引入dtd 有两种方法
- 引入本地 dtd
<!DOCTYPE 根元素 SYSTEM ‘地址’>
- 引入公共的 dtd
<!DOCTYPE 根元素 PUBLIC ‘地址’>
(2)<!ELEMENT 元素名 类型>
类型:EMPTY, ANY , #PCDATA
(3) dtd的修饰符
(4) 属性的细节
基本语法
<!ATTLIST 元素名 属性名 类型 特点 ..... >
l 类型有 五种:
CDATA 表示可以放入文本
ID 表示属性的值,不能重复,同时不要用数字开头.
IDREF/IDREFS 当一个元素的属性值,需要去引用另外一个ID ,则使用IDREF,如果希望引用多个,则使用IDREFS,请用空格隔开.
Enumerated 表示属性的值,只能是例举出了 比如
<!ATTLIST 学生 地址 CDATA #FIXED "北京" 学号 ID #REQUIRED 大哥 IDREFS #REQUIRED 性别 (男|女) #REQUIRED >
ENTITY 后面再说
属性的特点有四种
#REQUIRED 表示必须有
#IMPLIED 表示可以有
#FIXED “值” 表示如果有,则必须是什么
Default “值” 表示如果不指定,则默认.
实体(ENTITY)
就是实体用于为一段内容创建一个别名,以后在XML文档中就可以使用别名引用这段内容了
java :
String str=”你好”;
定义str,在别的地方,我们使用str就可以访问到 ‘你好’
(1) 分类
1,引用实体
案例
在 dtd 中定义:
<!ENTITY mycopy "我的公司版权">
说明:最好把定义放在dtd的最后
在xml中使用
&mycopy;
2,参数实体
基本语法
<!ENTITY % 实体名字 ”实体内容”>
引用
%实体名字;
举例:
<!ELEMENT 班级 (学生*)> <!ENTITY % myname "名字"> <!ELEMENT 学生 (%myname;,介绍,年龄)> <!ATTLIST 学生 地址 CDATA #FIXED "北京" 学号 ID #REQUIRED 大哥 IDREFS #REQUIRED 性别 (男|女) #REQUIRED > <!ELEMENT %myname; (#PCDATA)> <!ELEMENT 年龄 (#PCDATA)> <!ELEMENT 介绍 (#PCDATA)> <!ENTITY mycopy "我的公司版权">
学习dtd的目标:一般公司很少让程序员自己写 dtd,要求程序员看的懂dtd,同时可以根据给出的dtd,写出对应的xml
实际案例:
一个产品目录
dtd文件:
<!ENTITY AUTHOR "John Doe"> <!ENTITY COMPANY "JD Power Tools, Inc."> <!ENTITY EMAIL "[email protected]"> <!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)>
xml编写案例:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE CATALOG SYSTEM ‘product.dtd‘> <CATALOG> <PRODUCT NAME="康师傅矿泉水" CATEGORY="HandTool" PARTNUM="abc" PLANT="Milwaukee" INVENTORY="Backordered"> <SPECIFICATIONS WEIGHT="800" POWER="600" >这里是细节</SPECIFICATIONS> <PRICE>110</PRICE> </PRODUCT> </CATALOG>
CDATA 的意思是字符数据(character data)
PCDATA 的意思是被解析的字符数据(parsed character data)。
PDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。