【代码笔记】XML深入学习:DTD约束与DTD语法(1)
2017-07-13 10:04
489 查看
时孚
文件名 student.xml
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
DTD是什么:XML文档的类型定义,XML的约束。
如果a.xml文件受b.dtd的约束,那在a.xml文件中只能出现在b.dtd中定义的元素和属性。
html就是一个被DTD约束的文件,所以在html文件中不可能随意给出元素和属性
当然,dtd的扩展名字就叫
.dtd
文件名 student.dtd
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
DTD分为两类内部DTD:
内部DTD和外部DTD。
外部DTD又分为:SYSTEM(本地的)和PUBLIC(网上的)。
文件名 student1.xml
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
这里说明一下,刚开始编辑好代码后,运行发现提示好几行错误:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202002/02/97814fd066650e1d3ecc86fd4fe3ecb4.png)
后来发现错误是 没有打空格,百度的优秀解答说得很有道理,这里引用一下:内部DTD放在xml中,文档声明下,根元素上,以“ <!DOCTYPE 根元素名称 [ ”开头,以“ ] ”结束。
1. 为什么文件在IE里不显示?
因为语法有错。DTD element的定义里,元素名和后面的括号间必须有空格,像book(bookname,author,price),bookname(#PCDATA)等都要有空格。
把语法错误改了以后就可以显示。
2. 为什么错的DTD单独拿出来,xml可以显示?为什么DTD不能限制xml的显示顺序?
因为IE不根据DTD去验证XML的合法性。。。所以DTD是什么样的,在IE里都对XML没影响。
以上两个问题以及回答解答了我在学习中的疑惑,运行效果如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202002/02/5c3af6d531a9de1a3d6371c2611da8c0.png)
内部DTD只对当前xml文件有效。
外部DTD中的本地DTD
就是上面student.xml和student.dtd组合一起。
语法: <!DOCTYPE 根元素 SYSTEM "dtd文件路径">
外部DTD的网上DTD
语法: <!DOCTYPE 根元素 PUBLIC "dtd名称" "dtd网址">
文件名 student2.xm
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
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 学生 (姓名|年龄|性别)> ,表示“学生”子元素为“姓名”、“年龄”、“性别”其中之一,必须仅且能选择其一。
DTD语法之定义属性
<!ATTLIST> 就是 ATTRIBUTE LIST 的意思。(属性列表)
<!ATTLIST 元素名 属性名 属性类型 设置说明> 定义属性的语法结构
举例: <!ATTLIST 学生 学号 CDATA #REQUIRED> ,给“学生”元素定义属性“学号”,类型为文本,这个默认是必须的。
属性设置说明:
#REQUIRED :说明属性是必须的。
#IMPLIED :说明属性是可选的。
默认值 :在不给出属性值时,使用默认值。
属性类型
CDATA :文本类型
Enumerated :枚举类型
ID :ID类型,ID类型属性用于标记元素的唯一性,即元素的ID属性值不能与其他元素的ID值相同。
IDREF :ID引用类型,用于指定另一个元素,与另一个元素建立关联关系,IDREF类型的属性值必须是另一个元素的ID。
【代码笔记】XML深入学习:DTD约束与DTD语法(1)
2015-12-27文件名 student.xml
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
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>
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
DTD是什么:XML文档的类型定义,XML的约束。
如果a.xml文件受b.dtd的约束,那在a.xml文件中只能出现在b.dtd中定义的元素和属性。
html就是一个被DTD约束的文件,所以在html文件中不可能随意给出元素和属性
当然,dtd的扩展名字就叫
.dtd
文件名 student.dtd
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
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)>
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
DTD分为两类内部DTD:
内部DTD和外部DTD。
外部DTD又分为:SYSTEM(本地的)和PUBLIC(网上的)。
文件名 student1.xml
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
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>
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
这里说明一下,刚开始编辑好代码后,运行发现提示好几行错误:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202002/02/97814fd066650e1d3ecc86fd4fe3ecb4.png)
后来发现错误是 没有打空格,百度的优秀解答说得很有道理,这里引用一下:内部DTD放在xml中,文档声明下,根元素上,以“ <!DOCTYPE 根元素名称 [ ”开头,以“ ] ”结束。
1. 为什么文件在IE里不显示?
因为语法有错。DTD element的定义里,元素名和后面的括号间必须有空格,像book(bookname,author,price),bookname(#PCDATA)等都要有空格。
把语法错误改了以后就可以显示。
2. 为什么错的DTD单独拿出来,xml可以显示?为什么DTD不能限制xml的显示顺序?
因为IE不根据DTD去验证XML的合法性。。。所以DTD是什么样的,在IE里都对XML没影响。
以上两个问题以及回答解答了我在学习中的疑惑,运行效果如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202002/02/5c3af6d531a9de1a3d6371c2611da8c0.png)
内部DTD只对当前xml文件有效。
外部DTD中的本地DTD
就是上面student.xml和student.dtd组合一起。
语法: <!DOCTYPE 根元素 SYSTEM "dtd文件路径">
外部DTD的网上DTD
语法: <!DOCTYPE 根元素 PUBLIC "dtd名称" "dtd网址">
文件名 student2.xm
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
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>
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
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 学生 (姓名|年龄|性别)> ,表示“学生”子元素为“姓名”、“年龄”、“性别”其中之一,必须仅且能选择其一。
DTD语法之定义属性
<!ATTLIST> 就是 ATTRIBUTE LIST 的意思。(属性列表)
<!ATTLIST 元素名 属性名 属性类型 设置说明> 定义属性的语法结构
举例: <!ATTLIST 学生 学号 CDATA #REQUIRED> ,给“学生”元素定义属性“学号”,类型为文本,这个默认是必须的。
属性设置说明:
#REQUIRED :说明属性是必须的。
#IMPLIED :说明属性是可选的。
默认值 :在不给出属性值时,使用默认值。
属性类型
CDATA :文本类型
Enumerated :枚举类型
ID :ID类型,ID类型属性用于标记元素的唯一性,即元素的ID属性值不能与其他元素的ID值相同。
IDREF :ID引用类型,用于指定另一个元素,与另一个元素建立关联关系,IDREF类型的属性值必须是另一个元素的ID。
相关文章推荐
- 【代码笔记】XML深入学习:DTD约束与DTD语法(2)
- 【代码笔记】XML深入学习:DTD约束与DTD语法(1)
- xml学习笔记(2)DTD约束
- 学习笔记——XML的DTD语义约束
- xml学习笔记2--DTD约束
- 深入理解javascript学习笔记(一) 编写高质量代码
- XML学习笔记-XML的基本语法
- xml学习笔记——dtd和schema
- 黑马训练营 -----XML语法与DTD,Schema约束
- XML介绍之DTD约束语法详解一
- xml学习笔记(1)xml语法
- XML语法---学习笔记
- XML学习笔记之文档类型定义(DTD) 和实体(ENTITY)
- Struts 2 学习笔记 - 3.配置文件深入(1):struts.xml,bean,constant,package,namespace,include
- [XML学习笔记]004DTD的使用
- XML介绍之DTD约束语法详解五
- AS3----Spring 框架学习笔记(二)----xml智能提示DTD文件
- XML DTD 语言学习笔记
- jetty的学习笔记之jetty.xml文件语法
- XML DTD 语言学习笔记