1. 文档类型定义和命名空间
1) 文档类型定义
通过DTD来创建针对XML的规则。这种的XML文档就是有效的XML文档。
有效的(valid)XML 文档。首先XML文档是个格式正规的XML文档,然后又需要满足DTD的要求,这样的XML文档称为有效的XML文档。
2) DTD声明
3) 元素声明
4) 属性声明
5) 实体声明
6) 命名空间
2. 什么是DTD、为什么要用DTD
DTD可以实现对这些规则的约定,我们写的XML文档就要符合这种规定,那么这个XML文档就是有效的XML文档。
1) DTD文档与XML文档实例的关系就好比如是类与对象的关系,类是抽象的,对象是具体的。DTD也是这样子的它规定了这个XML文档必须要有某个元素,这个元素必须要有某个属性,也是一种抽象的描述,当我生成一个具体的XML文档之后,这些元素和属性也就相应的会出现。
2)如何生成一个DTD文档
(1) 所谓内部DTD就是表示DTD的内容是和XML的内容放在一起的,同一个文件中的。
所谓外部DTD就是表示DTD文档和XML文档时分开的,通过路径的方式使得XML文档能够引用到DTD。
内外部DTD文档结合用的比较少。
(2) 现在我们来写一下内部DTD文档,以及它们如何使用校验。
这次在XMLSpy软件上编辑,新建一个XML文档innerDTD.xml,如果对这个软件不是很熟悉的话,可以去网上找相关资料进行学习。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE poem [ <!ELEMENT poem (author, title, content)> <!ELEMENT author (#PCDATA)> <!ELEMENT title (#PCDATA)> <!ELEMENT content (#PCDATA)> ]> <poem> <author>王维</author> <title>鹿柴</title> <content>空山不见人,但闻人语声。 返景入深林,复照青苔上。</content> </poem>
在浏览器中运行,解析成功,这就是内部DTD实例。【注意】:再写DTD文档的时候,注意元素之间的空格。否则语法通不过。
【说明】:DTD中的元素的名称,顺序定义好之后,在写XML文档的时候必须按照这个名称,顺序写,而且也不能增加元素或减少元素,否则语法通过,但是逻辑上是不正确的。可以再XMLSpy上快捷键F7,与F8进行测试。
(3) 外部DTD,现在我们来练习一下外部DTD的使用方法
新建一个dtd.dtd
<?xml version="1.0" encoding="UTF-8"?> <!ELEMENT poem (author, title, content)> <!ELEMENT author (#PCDATA)> <!ELEMENT title (#PCDATA)> <!ELEMENT content (#PCDATA)>
新建一个xml.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE poem SYSTEM "dtd.dtd"> <poem> <author>王维</author> <title>鹿柴</title> <content>空山不见人,但闻人语声。 返景入深林,复照青苔上。</content> </poem>
在浏览器中运行,解析正确【说明】:注意其中<!DOCTYPE poem SYSTEM "dtd.dtd"> SYSTEM后面取的相对路径下的dtd文件,所以要将xml.xml与dtd.dtd放在同一级目录下.
【说明】:#PCDATA (Parsed Character Data),可解析的字符数据。简单来说就是字符串数据。
(4)内外部结合的DTD文档(这个用的比较少,稍作了解即可)
新建一个dtd_1.dtd
再新建一个xml_1.xml<?xml version="1.0" encoding="UTF-8"?> <!ELEMENT author (#PCDATA)> <!ELEMENT title (#PCDATA)>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE poem SYSTEM "dtd_1.dtd"[ <!ELEMENT poem (author, title, content)> <!ELEMENT content (#PCDATA)> ]> <poem> <author>王维</author> <title>鹿柴</title> <content>空山不见人,但闻人语声。 返景入深林,复照青苔上。</content> </poem>
在浏览器中运行,xml解析成功。哪些元素在里面,哪些元素在外面是没有关系,只要合并起来能够约束到xml文档就是可以的。
【注意】:外部的DTD有一个好处是可以复用,它可以验证这个文档,也可以验证另外一个文档,如果是内部的DTD,它只能验证当前的文档。