第3章 DTD规范XML文档
DTD被用来规范XML文档,因为DTD 可以指定:可以在文档中存在的元素、元素可以具有的属性、在元素内部元素的层次结构以及元素在整个文档中出现的顺序等。在本章将详细介绍DTD规范的有关基础知识。
本章知识要点:
理解DTD的基本概念
掌握DTD声明XML元素的方法
理解实体的概念及其作用
掌握使用DTD的基本方式
了解XML Schema模式的基本概念
理解XML Schema模式的作用
3.1 DTD基本概念
DTD是Document Type Definition(文档类型定义)的缩写。XML文档是一种可扩展标记语言,它可以由DTD来定义文档元素结构(如文档中的元素、属性等)。DTD指定XML文档必须遵守的一系列规则,从而确保XML文档的一致性和有效性。本节将介绍DTD的基本概念和DTD文档的组成元素,以后续学习打下基础。
3.1.1 DTD简介
由于应用需求会发生变化,从而导致先前所编写的XML文档需要加以改变以适应需求的变化。而当文档结构改变时,就需要修改程序代码。在修改过程中,如何确保XML文档的有效性将直接影响程序运行结果。为了解决这一问题,就需要依靠逻辑清晰、语法准确的文档来对XML文档加以限制。DTD的主要用途就是确保XML文档的有效性。
3.1.2 DTD基本结构
DTD 使用形式语法来描述XML 文档的逻辑结构和语法。实际上DTD可以看作XML文档的模板。这些XML文档中的元素、属性、排列方式或内容等都必须符合DTD的规则。XML文档中的元素是根据实际应用来创建的。因此想要创建一份完整且具有较强适应性的DTD是非常困难的,因为各行业都有他们自己的行业特点,所以具体DTD文档通常在特定应用领域中使用,各行各业都有各自的DTD文档。
3.2 DTD对元素声明
XML元素是XML文档的基本组成部分。在有效的XML文档中的任何元素都必须在DTD中进行声明。元素声明指定了每个元素的名称、属性、内容以及在文档中出现的频率并且指定XML文档中元素的层次结构。在这一节中就将介绍如何使用DTD声明元素。
3.2.1 元素类型声明
在有效的XML文档中,元素使用前必须进行元素类型声明。元素类型声明不但说明了所关联的XML文件中可能存在的元素以及元素名称,而且给出了元素的具体类型:空元素、文本元素或嵌套子元素。通过层层深入地声明XML元素来定义XML文档中元素的层次关系。也就是说,DTD通过元素之间的父子关系类描述XML文档中元素的结构关系。
3.2.2 元素内容类型
在上一小节元素类型声明中提到了元素内容有五种类型,即EMPTY、ANY、#PCDATA、子元素型和混合型。
3.2.3 元素声明综合示例
在这一节中向读者详细介绍了DTD对元素的声明,在这一小节将通过一个比较详细的实例展示各知识点的使用。
<!DOCTYPE 家庭 [
<!ELEMENT 家庭 (成员+,家电*)>
<!ELEMENT 成员 EMPTY>
<!ELEMENT 家电 EMPTY>
<!ATTLIST 成员
名字 CDATA #REQUIRED
性别 (男|女) #REQUIRED
年龄 CDATA #REQUIRED
爱好 CDATA #IMPLIED
>
<!ATTLIST 家电
名称 CDATA #REQUIRED
数量 CDATA #REQUIRED
说明 CDATA #IMPLIED
>
]>
<家庭>
<成员 名字="郭禄" 性别="男" 年="25" />
<成员 名字="符荣" 性别="女" 年="25" 爱好="乒乓球"/>
<家电 名称="黑白电视机" 数量="3" 说明="1982年购买,现在(2008/3/17)正常使用" />
</家庭>
3.3 DTD对属性声明
属性是描述元素的额外信息的,是对元素的修饰与补充。一般地,信息详实的XML文档都具有一个特点,元素通过属性来描述边缘信息。本节将介绍如何在DTD中声明属性及属性的各种类型。
3.3.1 属性声明语法
在DTD中,属性声明使用ATTLIST属性列表声明来指定元素的属性列表。元素的属性声明由ATTLIST关键字、元素名称以及属性定义三个部分构成。一个属性声明可以声明一个元素的多个属性。
|
属性类型 |
含义 |
|
CDATA |
字符数据,即没有标记的文本 |
|
枚举 |
备选属性值的值列表 |
|
ID |
该属性在文档中具有唯一性 |
|
IDREF |
文档中元素的ID类型属性的值 |
|
IDREFS |
由空格分隔的元素的多个ID |
|
ENTITY |
在DTD中声明的实体的名称 |
|
ENTITIES |
在DTD中声明的由空格分隔的多个实体的名称 |
|
NMTOKEN |
XML名称记号 |
|
NMTOKENS |
由空格分隔的多个XML名称记号 |
|
NOTATION |
在DTD中声明的记法的名称 |
3.3.2 属性类型
属性类型CDATA的含义不同与第二章介绍的CDATA区段,属性类型CDATA表示可以包含任何字符串,但不允许使用小于号“<”、大于号“>”、与符号“&”、双引号“"”和单引号“'”这几个字符。如果需要使用这几个特殊字符,则必须使用实体引用(如<、>等)来替换它们。
3.3.3 属性附加声明
在DTD的属性声明语法结构中,每个ATTLIST声明除了有一个属性类型外,还必须具有附加声明。DTD提供了四种附加声明:#REQUIRED、#IMPLIED、#FIXED和缺省值。
3.4 DTD引用
一个规范的XML文档如果和某个DTD文相关联,并遵守该DTD规定的约束条件,那么该XML文档就称为有效的XML文档。我们可以把DTD文件内容直接写在XML文件的内部,也可以形成独立于XML的DTD文件。
3.4.1 引用内部DTD
如果DTD文件内容直接写在XML文件的内部,那么这样的内容称为XML文件的内部DTD。
3.4.2 引用外部DTD
使用外部DTD时,要在DOCTYPE中使用关键字SYSTEM或PUBLIC。使用SYSTEM关键字主要用于引用一个作者或组织所编写的众多XML文件所通用的DTD文件。基本语法格式已经在3.1.2节中介绍过。在使用PUBLIC关键字引用外部DTD文件的基本语法格式中的DTD-URL被称为FPI(Formal Public Identifier,正式公用标识符),也称作实体的“publicld”。 FPI有严格的形式,以保证它的全球唯一性。
3.4.3 混合引用DTD
如果XML文件同时带有内部DTD和外部DTD文件,那么XML解析器会将二者合一。如果内部的DTD和外部的DTD文件同时声明了某个元素,那么将会导致错误。如果不准备更改一个已经获得广泛支持的DTD文档,但是又需要增加新的内容时,可以同时使用内部DTD和外部DTD。内部DTD可以方便地增加新内容,又不影响其他使用同一外部DTD的XML文档的有效性。
<!DOCTYPE 书架 SYSTEM "dtdFile.dtd"[
<!ELEMENT 描述 (#PCDATA)>
]>
<书架>
<描述>在我十二岁生日时,爸爸把它作为生日礼物送我.</描述>
<图书>
<书名>格林童话</书名>
<作者>雅科布.格林、威廉.格林</作者>
</图书>
</书架>
3.5 实体声明与引用
XML的实体机制允许将不同类型的数据并入XML文档中。在XML文档中,可以将经常使用的XML文本区段定义成实体,这样可以快速地将XML文字插入到任何可以插入的地方。此外,也可以将外部文件定义成实体,然后将外部数据附加到XML文档。
3.5.1 实体的概念与分类
实体是一个预先定义的数据或数据集合。通过实体可以方便地被引用到任何需要这些数据的地方。另外,通过实体也可以将非XML数据(比如可以将图形和影像等二进制数据)引进到XML文档中。
实体可以通过下面三种方式进行分类:
(1)普通实体与参数实体
(2)内部实体与外部实体。
(3)已解析实体与未解析实体。
3.5.2 内部普通实体
内部普通实体就是实体的内容已经包含在DTD文件本身中并且可以在XML文档中引用的实体。内部普通实体一般包含常用文本或较难输入的文本内容。DTD文件中的内部普通实体是用<!ENTITY>声明定义的。
3.5.3 外部普通实体
XML允许其他XML文档或文档片段嵌入到XML文档中,通过实体引用可以使解析器在指定资源上找到所需要的文档或文档片段,并将这些文档组合成为一个新XML文档。外部普通实体通过URI来定位资源数据。外部普通实体的格式分为两种:SYSTEM格式和PUBLIC格式。
3.5.4 内部参数实体
参数实体是专门用在DTD中的一种实体。参数实体在DTD中定义,并只能由DTD文件自身通过实体引用使用参数实体。使用参数实体不仅可以方便DTD的编写,也有利于DTD文件的维护。
参数实体分为内部参数实体和外部参数实体。参数实体引用是以%开头,并以分号结束,且只出现在DTD中。
3.5.5 外部参数实体
外部参数实体允许把较小规模的DTD进行组合来建立较大规模的DTD,即在一个DTD中可以引用另一个DTD文档,从而可以使用引进的DTD中元素及属性的声明。
3.6 XML Schema简介
对于XML Schema语言有两种模型:Microsoft开发的Microsoft XML Schema和W3C开发的W3C XML Schema。Microsoft XML Schema已经开发成熟并运用到实际,而最为正式的XML Schema语言是由W3C制定的XML Schema规范,简称为xsd(XML Schema Definition)。本节主要介绍W3C制定的XML Schema规范。由于XML Schema规范体系非常庞大,因此仅对XML Schema模式最基本的内容给予简单的介绍。
3.6.1 XML Schema基本概念
XML Schema是用一套预先规定的XML元素和属性创建的,这些元素和属性定义了文档的结构和内容模式。相应的一套精巧的规则(这些规则用DTD来表示)指定了每个Schema元素或者属性的合法用途。如果违反这些规则,那么解析器将拒绝解析XML Schema以及任何同它相联系的文档。
3.6.2 XML Schema数据类型
W3C XML Schema数据类型分为简单类型和复杂类型两种。
|
简单数据类型 |
说明 |
|
string |
字符串型 |
|
decimal |
十进制数型,包含任意精度和位数 |
|
integer |
整型 |
|
float |
标准的32位浮点数,如11.87 |
|
boolean |
布尔型,元素只能取真或假的值(或者1或0) |
|
date |
日期型,格式为YYYY-MM-DD |
|
month |
日期型,格式为YYYY-MM |
|
year |
年份日期型,格式为YYYY |
|
time |
时间型,格式为HH:MM:SS |
|
datetime |
日期时间型,其形式为YYYY-MM-DD hh:mm:ss |
|
uri-reference |
元素包含一个URL |
3.6.3 XML根元素声明
XML Schema模式扩展名为“.xsd”的一个文本文件,使用XML语法来编写,这一点和DTD文件不同。XML Schema模式的根元素必须是schema,使用的命名空间必须是:
http://www.w3.org/2001/XMLSchema
3.6.4 XML元素及其属性声明
在前面两小节中介绍了XML Schema数据类型和根元素的声明,在本小节中将简要介绍XML Schema文档的元素声明以及属性声明。
3.6.5 XML Schema范例说明
在前面对XML Schema的基本语法进行的简单介绍,在本小节将通过一个实例来具体介绍如何使用XML Schema来限定XML文档结构。
3.6.6 XML Schema引用
xsi:noNamespaceSchemaLocation表示没有定义目标命名空间,xsd文档是从本地文件。有关引用XSD文档的详细信息请查阅其他有关资料。