这个保存为dvd_embedded_dtd.xml的文件可以在资源文件中找到。 内部和外部DTD也可以同时使用。如果在元素和属性定义中有冲突发生,以内部DTD为准。
使用外部DTD的情况比较常见。这种方法可以用一个DTD文件来验证多个XML文档的有效性,也使DTD和文档实例更易于维护。
嵌入的DTD可以用来重载外部DTD。这与用嵌入的CSS声明来重载外部样式表非常类似。
如果应用DTD的文档是孤立的,使用嵌入的元素和属性声明会更加简单方便。即使不需要定义元素和属性,还是有可能需要定义实体的。
注解 如果包括一个对外部DTD的引用,且该DTD中含有实体定义,则必须将XML声明中的standalone
属性设置为no:
现在再来看看另一个更为常用的XML有效性判断语言——XML模式。
2.2.2 XML模式
XML模式与DTD有很多相似的地方。例如,两者都用于确定XML文档的结构。通过阅读http://www/w3.org/TR/xmlschema-0/上的W3C初级文档可以了解更多关于XML模式的内容。
DTD与XML模式也有很多不同。首先,XML模式语言是XML词汇的一种。XML模式比DTD功能更强,包含很多概念,如数据类型和继承等。然而,与DTD相比,
它们的构造也更为复杂。另一个缺点就是XML模式没有提供与DTD实体声明相同的功能。
关于XML模式的一个重要方面就是,在XML文档中,模式处理程序是一个个地验证元素的有效性的。这就使不同的元素可以依据不同的模式进行有效性验证,也使逐个地验证每个元素的有效性成为可能。如果文档中的每个元素根据适当的模式都被验证为有效的,则这个文档就是有效的。
这种元素级别的有效性验证有一个缺点,即XML模式并不提供确定文档元素的方法。因此,如果元素都是有效的,文档就是有效的,而不管其中是否包含了文档元素。
首先看看描述dvd.xml文档结构的模式:
直观看来,这个模式与此前的DTD有着很大的不同。最明显的区别就是,模式是基于标签的并且使用命名空间。由于是通过使用XML来创建模式词汇,因此可以利用一些标准的XML创建工具。XML模式也包含了一些适用于元素和属性的数据类型。例如,id属性使用的数据类型是xs:integer。
现在我们通览一遍这个模式文档。它以一个标准XML声明开始。文档元素称为schema,其中包含了一个到XML模式命名空间http://www.w3.org/2001/XMLSchema的引用:
按照惯例,这个命名空间通常用前缀xsd或xs进行关联。本例中用的是xs前缀。
这个模式中使用的是Russian Doll符号,其中元素的声明位于文档的相应位置。也就是说,元素声明的嵌入点也预示着元素的相对位置。将模式文档组织成其他形式也是可以的。
第一个定义的是文档元素
定义包括如下内容:
这些声明将元素定义为复合类型(complex type)元素,这就表示它会以某种顺序(
通过使用
如果元素恰恰只出现一次,就可以省略掉minOccurs和maxOccurs属性。
子元素是简单类型的,因为它们只包含有文本。如果它们包含属性,它们就会自动成为复合类型元素,但是此文档中唯一的属性包含于
通过指定名称和数据类型就可定义简单类型元素:
XML模式推荐标准中列出了44条内建的简单数据类型,包括string、integer、float、decimal、data、time、ID和Boolean。在http://www.w3.org/TR/xmlschema-2/中可以了解更多关于这些数据类型的内容。也可以自己定义复杂数据类型。
可以对属性值加上约束条件以限制元素的可能取值范围。 图2-1在Altova XMLSpy中并列地显示了XML文档和模式。
图2-1 XML文档及其相关模式
1.可选的布局
在上个例子中,只有
下面的代码是经过重写的模式文档,它使
可以在资源文件中找到保存为dvd_global.xsd的文档。
重写的模式文档变化不大。整个