转自:https://www.cnblogs.com/xiaofu007/p/5079428.html
文件名 student.xml
1 <?xml version="1.0" encoding="GB2312" standalone="no"?>
2 <!--大家好,我是注释-->
3 <!--2015.12.27-->
4 <!DOCTYPE students SYSTEM "student.dtd">
5 <!--这里没写盘符,及表示当前目录下,也就是说两个文件(student.xml和student.dtd)要放一起-->
6
7 <students>
8 <student number="ITCAST_1001">
9 <name>张三</name>
10 <age>23</age>
11 <sex>male</sex>
12 </student>
13
14 <student number="ITCAST_1002">
15 <name>李四</name>
16 <age>25</age>
17 <sex>female</sex>
18 </student>
19 </students>
- DTD是什么:XML文档的类型定义,XML的约束。
- 如果a.xml文件受b.dtd的约束,那在a.xml文件中只能出现在b.dtd中定义的元素和属性。
- html就是一个被DTD约束的文件,所以在html文件中不可能随意给出元素和属性
- 当然,dtd的扩展名字就叫 .dtd
文件名:student.dtd
1 <!--大家好,我是注释-->
2 <!--2015.12.27-->
3
4 <!--“#PCDATA”表示元素中嵌套的是普通的文本字符串-->
5
6 <!ELEMENT students (student+)>
7
8 <!--“student+”中“+”加号表示拥有一到多个student元素-->
9
10 <!ELEMENT student (name,age,sex)>
11 <!ELEMENT name (#PCDATA)>
12 <!ELEMENT age (#PCDATA)>
13 <!ELEMENT sex (#PCDATA)>
DTD根据所处位置分为两类:
- 内部DTD和外部DTD。
- 外部DTD又分为:SYSTEM(本地的)和PUBLIC(网上的)。
内部dtd:
1 <?xml version="1.0" encoding="GB2312" standalone="yes"?>
2
3 <!--大家好,我是注释-->
4 <!--2015.12.27-->
5
6 <!--“#PCDATA”表示元素中嵌套的是普通的文本字符串-->
7 <!--“student+”中“+”加号表示拥有一到多个student元素-->
8 <!DOCTYPE students[
9 <!ELEMENT students (student+)>
10 <!ELEMENT student (name,age,sex)>
11 <!ELEMENT name (#PCDATA)>
12 <!ELEMENT age (#PCDATA)>
13 <!ELEMENT sex (#PCDATA)>
14 ]>
15
16
17 <students>
18 <student number="ITCAST_1001">
19 <name>张三</name>
20 <age>23</age>
21 <sex>male</sex>
22 </student>
23
24 <student number="ITCAST_1002">
25 <name>李四</name>
26 <age>25</age>
27 <sex>female</sex>
28 </student>
29 </students>
外部DTD中的本地DTD
就是上面student.xml和student.dtd组合一起。
语法: <!DOCTYPE 根元素 SYSTEM "dtd文件路径">
外部DTD的网上DTD
语法: <!DOCTYPE 根元素 PUBLIC "dtd名称" "dtd网址">
1 <?xml version="1.0" encoding="GB2312" standalone="no"?>
2 <!--大家好,我是注释-->
3 <!--2015.12.27-->
4
5 <!DOCTYPE students PUBLIC ".//qdmmy6//DTD ST 1.0//ZH" "http://www.qdmmy6.com/xml/dtds/st.dtd">
6
7
8 <students>
9 <student number="ITCAST_1001">
10 <name>张三</name>
11 <age>23</age>
12 <sex>male</sex>
13 </student>
14
15 <student number="ITCAST_1002">
16 <name>李四</name>
17 <age>25</age>
18 <sex>female</sex>
19 </student>
20 </students>
- DTD语法之定义元素
- 定义元素的语法: <!ELEMENT 元素名 元素描述>
- 举例1: <!ELEMENT 学生 (#PCDATA)> ,定义了一个"学生"元素,内容为文本类型 (“#PCDATA ”)。
- 举例2: <!ELEMENT 学生 (姓名,年龄,性别)> ,定义了一个"学生"元素,内容依次为“姓名”、“年龄”、“性别”元素。
- 举例3: <!ELEMENT 学生 ANY> ,定义了一个"学生"元素,内容随意不受限。
- 举例4: <!ELEMENT 学生 EMPTY> ,定义了一个"学生"元素,不能有内容,即空元素,空元素可以有属性。
- 子元素出现次数可以使用 *、+、? 来指定子元素出现的次数。
- *:可以出现0~N次;
- +:可以出现1~N次;
- ?:可以出现0~1次。
- 举例: <!ELEMENT 学生 (姓名,年龄?,业余爱好*,成绩+,性别)> ,定义一个“学生”元素,第一个子元素为“姓名”,必须且仅能出现一次,“年龄”是可有可无的,“业余爱好”可以出现0~N次,grade可以出现1~N次,“性别”必须且仅能出现一次。
- 枚举类型子元素
- 举例: <!ELEMENT 学生 (姓名|年龄|性别)> ,表示“学生”子元素为“姓名”、“年龄”、“性别”其中之一,必须仅且能选择其一。
- 定义元素的语法: <!ELEMENT 元素名 元素描述>
- DTD语法之定义属性
- <!ATTLIST> 就是 ATTRIBUTE LIST 的意思。(属性列表)
- <!ATTLIST 元素名 属性名 属性类型 设置说明> 定义属性的语法结构
- 举例: <!ATTLIST 学生 学号 CDATA #REQUIRED> ,给“学生”元素定义属性“学号”,类型为文本,这个默认是必须的。
- 属性设置说明:
- #REQUIRED :说明属性是必须的。
- #IMPLIED :说明属性是可选的。
- 默认值 :在不给出属性值时,使用默认值。
- 属性类型
- CDATA :文本类型
- Enumerated :枚举类型
- ID :ID类型,ID类型属性用于标记元素的唯一性,即元素的ID属性值不能与其他元素的ID值相同。
- IDREF :ID引用类型,用于指定另一个元素,与另一个元素建立关联关系,IDREF类型的属性值必须是另一个元素的ID。
个人觉得用xml的那种嵌套格式来写dtd也许更直观,比如上面student.dtd改成这样写
<!ELEMENT students>
<student+>
<name>#pcdata</name>
<age>#pcdata</age>
<sex>#pcdata</sex>
</student>
</students>
这样写可能更便于阅读,但是原生语法写起来更便捷,毕竟dtd文件不是给人看的。