关于命名空间的最后一点是关于它们使用的属性。默认情况下,属性与它包含的元素属于同一个命名空间中。除非你使用的是不同于其包含元素的其他命名空间中定义的属性,否则就不必进行验证。
在关于如何使用DTD和XML模式定义XML词汇的内容中,将会进一步说明命名空间的重要性。
2.2 定义XML词汇
基于XML的语言通称为XML词汇,可以用DTD、XML模式或是其他模式语言对其加以定义。很多工业组织共同定义了他们自己的XML词汇。
如果需要使用XML词汇,就必须了解其构造规则。这些规则是产生符合语言构造标准的有效的XML文档的保证。
这些规则也使XML处理程序可以检查XML文档的一致性。这个过程称为有效性检查,进行这项工作的处理程序称为有效性解析器。第1章提供了一些如何处理XML文档的信息。
可以通过编写模式来共享XML词汇的规则。这是一个人或有效性处理器都可用的规范描述。如果只是在某个孤立的应用程序中使用XML文档,这种词汇的制定可能显得过分了。其真正的意义在于,当这个语言需要被其他人或应用程序共享时,每个用户都可以检查文档是否构造正确。
有两种常用的模式:DTD和XML模式。它们都由W3C定义并由他们控制。实际上,DTD本身就是XML推荐标准的一部分。
这里还是使用第1章中DVD库的例子:
首先看看如何建立一个DTD来描述这个词汇。
2.2.1 文档类型定义
DTD描述的是文档的结构,它指明一个元素可以出现多少次、它是否可选的以及它是否包含属性等等。
有效性解析器可以根据其DTD来检查一个XML文档是否有效。如果不是,解析器会报告一个错误。符合某个DTD的XML文档称为该DTD的一个文档实例。
本书并不是一部关于DTD的完整参考手册,但它包含了理解和构造DTD所需要的足够的信息。下面的DTD定义了DVD库文档:
这份文档被保存为dvd.dtd,可以在本书下载资源中找到。引用这个DTD的XML文档称为dvd_dtd.xml,其实叫什么名字并不重要。
这个DTD中演示了两种声明的类型,一种用于声明元素,另一种用于声明属性。其中还可以添加实体和符号的声明。但是符号声明并不常用,所以在稍后的“实体声明”部分中只对实体声明加以介绍。
1.元素类型声明
元素类型声明提供的是关于元素的信息。该声明以!ELEMENT文本开始并且列出元素名及其内容。内容可以是数据类型或是列在DTD中的其他元素:
空元素中显示的是EMPTY:
在下面的DTD例子中,
其中元素的顺序也指定了它们应该出现在XML文档实例中的位置。 解析字符数据(PCDATA)说明元素的内容是文本,并且XML解析器应该将此文本解析成字符和实体引用。
可以用一些修饰符来对子元素提供进一步说明。这些修饰符可参见表2-1。 表2-1 DTD中元素类型定义所用的符号 符 号
, + | () * ?
解 释
规定子元素的顺序
规定元素必须出现至少一次(一次或
多次)
允许从一组元素中选择一个元素 将内容标记成一个组
规定元素为可选,可以出现任意多次(零次或多次)
规定元素为可选,如果出现,只能有一次(零次或一次)
无符号表示元素必须出现一次
2.属性列表声明
属性声明出现在元素声明之后,它更复杂一些。可以通过添加属性列表声明表明元素中包含属性:
本行中,
注解 设置必须属性时并不会影响DTD中其他元素的声明。在该元素中包含子元素,而且也称为id,是完全
可以的。
最常用的属性类型为CDATA,但也可以声明为其他的类型:
l ID:一个唯一的识别符; l IDREF:另一个元素的ID ; l IDREFS:其他元素的一列ID; l NMTOKEN:一个有效的XML名字; l NMTOKENS:一列有效的XML名字; l ENTITY:一个实体名字; l ENTITIES:一列实体名字; l LIST:一列特定值。
关键字#REQUIRED表明此属性必须存在。也可以用#IMPLIED来表明一个可选属性。用#FIXED来表明此属性只能有一个值。如果XML没有包含这个属性,有效性解析器就会插入一个固定值。使用不是固定值的值会产生解析器错误。
如果需要指定属性可选的值,可以使用管道字符(|):
此行表明
3.实体声明
第1章中介绍了如何使用内建实体类型,也提到了可以自己定义实体以表示固定的数据。例如,可以将实体引用©right;指定为文本Copyright 2006 Apress。在DTD中可以这样定义这个实体:
这是个简单的内部实体声明。也可引用外部实体并用它将大量的内容包含在XML文档中。这与在XHTML文档中使用服务器端的包含文件比较类似。
下面的XML文档引用了几个实体:
这个文档从几个实体中取得它的内容,每个实体都代表一个外部XML文档。DTD需要为每个实体都添加一个声明。例如,可以将tableOfContenets实体定义如下:
4.将DTD关联到XML文档
目前已经介绍了如何构造DTD,但还没说明如何将之关联到XML文档。可以将DTD嵌入到XML文档内部,也可在文档中添加对外部DTD的引用。
对外部DTD的引用可以添加在XML文档的序言中:
也可将DTD直接嵌入到XML文档的序言中: