DTD验证

DTD是个什么玩意?
在学习CSS的时候,应该提及到。
在XHTML文档中,就有它的身影
DTD验证
它的作用是什么?—确保结构书写是正确的和对css的解析(盒模型)
1.什么是Xml验证
XML中,DTD有何作用呢?
Xml的作用是什么?----保存数据(20%) + 传输数据(80%)
请问,我们在传输数据的时候,需要注意什么?
肯定涉及到双方的问题,甲方乙方,
甲方 --> 乙方
乙方 --> 甲方
双方应该遵循一个规则。谁来指定规则,如何检验是否遵循规则。
Xml其实是需要通过验证的。
通常有两种方式:
DTD:Document Type Definition,文档类型定义,目前使用最多的一种
Schema:结构,XSD,Xml Schema Definition,文档结构定义,未来的趋势,功能强大。
我们讲解第一种DTD。
DTD用来验证我们的xml是否符合它的定义。
格式良好的文档:语法正确文档
合法的文档:在语法正确的基础之上,符合某个规范的xml文档
格式良好的文档 是否是合法的文档?不一定
合法的文档 是否是格式良好的文档?一定
2.快速入门
验证xml文档是否是合法。
需要有xml文档,还需要有DTD。
首先写一个XML文档
DTD验证
然后编写对应DTD
有两种引用方式,一是在xml文档中直接定义,二是外部定义,然后引用
直接在xml文档中进行定义,如下:
DTD验证
由于,是在当前xml中来定义,所以无需引入
如何验证呢?
专业软件 iexmltls (只针对IE浏览器)
代码校验 (只针对IE浏览器)可以参考w3c手册
在线验证(http://validator.w3.org/)
xml编辑器–spyxml(推荐)
DTD验证
DTD验证
3.DTD作用
通过DTD可以干什么?
通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。
而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。
您还可以使用 DTD 来验证您自身的数据。

注意事项
DTD描述了XML文档有哪些节点、节点之间的关系以及节点的值等。(学习重点)
DTD验证的不是语法,而是验证XML文档中应该有哪些节点,节点之间的关系是什么,元素的值、属性的值应该由什么内容组成。
XML没有DTD,可以正常工作,但不能很好的工作。
合法的 XML 文档是“形式良好”的 XML 文档,且遵守文档类型定义 (DTD) 的语法规则。

Xml文档是一种树形结构,包括三种节点:元素节点,属性节点,文本节点
我们要定义这个DTD,也需要从这方面来考虑。
4.元素定义
格式:<!ELEMENT 元素名 (元素内容描述)>
注意,中间有空格,
重点关注的是元素内容描述。

首先,我们分析一下元素的表现形式:
仅包含元素的元素
仅包含文本的元素
包含文本和元素的混合内容:105个男人和<strong>3个女人</strong>的故事
空元素
任意元素
(1).包含元素的元素
相对简单,通常有两种结构:
顺序结构,直接使用 逗号 分隔开
选择结构,使用 | 分割
A.顺序结构:
DTD验证
意味着,
每个元素都要出现,并且只能出现一次,还要按照顺序依次出现。

B.选择结构
非a即b
DTD验证
意味着,二者只能出现其中的一个,且必须出现一个。

如果需要某个元素出现多次,如何处理?
使用数量词即可,有三种数量词:
*: 任意个,包括0
+: 至少一个,至多不限
?: 0或1个

(2).仅包含文本的元素
这种比较简单,最简单。

也就是说,在元素中,包含的是纯文本。不要再嵌套其他任何标签。
直接使用 (#PCDATA) 可解析的字符数据,说白了,就是普通字符串。
DTD验证
(3).包含文本和元素的元素
混合情况,最复杂的一种。
如图所示:
DTD验证
对body的内容做一个分解,分解为可以处理的简单情况,如下:
DTD验证
DTD验证
DTD验证
第一种和第三种,都是包含仅文本的 body (#PCDATA)
第二种是包含元素,body (strong)
将它们结合到一起
body (#PCDATA) body (strong) body (#PCDATA)
结合前面所学的 选择结构 + 数量词
body (#PCDATA|strong)*
DTD验证
[注意]:在DTD文件内部定义混合内容模型,必须要使用选择组合,#PCDATA关键字必须出现在子元素列表的第一个位置,且必须要使用*。
(4).空元素
直接使用empty
DTD验证
使用有两种形式:
DTD验证
DTD验证
标签中不能有任何的内容。
(5).任意元素
可以是任意的内容,使用ANY来声明
DTD验证
声明了这个any之后,就可以在any元素中包含任何内容。
所以,实际上我们很少会使用any。
DTD验证
5.属性定义
属性很特殊,是依赖于元素而存在的,声明属性一定或和元素挂钩的。
所以,声明一个属性,我们需要得知如下几个要素:
属于哪个元素
属性名称
属性的类型
属性的取值方式
定义的属性格式:<!ATTLIST 元素名 属性名称 属性的类型 取值方式>
属性的类型有哪些呢?
DTD验证
取值方式有哪些呢? 有#,且都是大写
DTD验证
举例如下:
DTD验证
DTD验证
查看其内容,
DTD验证
上面图片的解释为gender属性可选择 男或者是女,默认是男,在文本中即使没有写出值,但是在浏览器里面可以看到gender=“男”

DTD验证
DTD验证
上面图片的意思是制定 name标签中 nationality这个属性会有固定文本值"中国",即使没写出来也会在浏览器中显示,另外这个值是#FIXED,也就是不能修改成别的值
注意,如果指定某个属性是固定值,就不能写其他的值。
细节,
a.ATTLIST,可以一次性定义多个属性,
DTD验证
可以用一句来定义,如下:
DTD验证
b.关于取值类型,必须要设置
如果没有固定值、又没有默认值,而且也不是必须的,那么此时一定要声明为#IMPLIED。

6.实体定义
文本节点,本身是无需定义的。
书写字符串的时候,有时候会重复的使用某个的内容,此时为了 方便,可以将其定义为实体。类似在编程中的变量的含义。

除了XML预定义的5个实体之外,我们还可以自己来定义实体。

DTD中,通常有两种实体:
一般实体,在DTD中来定义的,然后在xml文档中来引用的
参数实体,在DTD中来定义的,但是他是在DTD中引用的。
(1).一般实体
定义格式:<!ENTITY 实体名称 值>
引用:&实体名称;
既可以在内部定义中使用,也可以在外部实体中定义然后使用。
DTD验证
查看效果如下:
DTD验证
单独的定义一个外部DTD,然后在xml文档中引入外部DTD,也是可以使用的。
DTD验证
然后在xml文档中,引入dtd,并引用实体
DTD验证
结果如下:
DTD验证
(2).参数实体
只能是在外部DTD中定义,并且只能在DTD中引用。
意味着:
A.必须以外部的方式来引用DTD
B.参数实体,不能直接在xml中引用,只能在DTD中引用
定义格式:<!ENTITY % 实体名称 值>
引用格式:%实体名称;
用法如下:
DTD验证
对应的在xml文档中来引用一般实体,如果引用参数实体,是不能解析的。
DTD验证
结果如下:
DTD验证
此处,还需要注意一点,不要用浏览器来看它们的效果,
DTD验证
原因在于对于外部DTD,我们的浏览器它是不会去加载的。
DTD是为xml服务的。
看一个简单的应用。
DTD验证
html标签

<!ELEMENT html (head,body)>

ul标签

<!ELEMENT ul (li)+>

dl标签

<!ELEMENT dl (dt,dd)*>

查看w3c的DTD定义如下:
DTD验证
DTD验证
DTD验证
属性定义
DTD验证