2.1 XML文档的分类
虽然XML的语法相当简单,简单到几乎没有语法,但XML文档作为一种结构化的文档,在呈现给XML处理程序时,为了保证XML处理程序能更好地处理这份XML文档,还是有一些必须遵守的规则。按照对XML文档规范的遵守程度,可将XML文档分为如下3种类型:
格式不良好(malformed)的XML文档:完全没有遵守XML文档基本规则的XML文档。
格式良好(well-formed)但无效的XML文档:遵守了XML文档基本规则,但没有使用DTD或Schema定义语义约束的XML文档;或使用DTD或Schema定义了语义约束,但没有遵守DTD或Schema所定义的语义约束的XML文档。
有效(valid)的XML文档:遵守了XML文档基本规则,并使用DTD或Schema定义了语义约束,而且也完全遵守了DTD或Schema所定义的语义约束的XML文档。
2.1.1 格式不良好的XML文档
这种XML文档完全没有遵守XML文档规则,是最差的XML文档,它甚至不是一份结构化的文档,因此不能正常转换为树状结构。
下面的XML文档没有遵守XML的文档规则,因而是一份格式不良好的XML文档:
程序清单:codes\02\2.1\malformed.xml
在上面的XML文档中,第1个<计算机书籍…/>元素的<作者…/>子元素没有正确结束,<简要介绍…/>子元素缺少结束标签,第2个<计算机书籍…/>元素的<书名…/>子元素与后面的<bookname…/>子元素不能匹配。因此,该文档是无效XML文档,这种文档在浏览器中不能正常浏览,图2.1所示是使用Firefox浏览上述文档时的结果。
图2.1 格式不良好的XML文档的浏览结果
使用XMLSpy或Stylus Studio可轻松地验证一份XML文档是否格式良好,如前一章所讲,在XMLSpy下按F7键即可验证当前XML文档是否格式良好,按F8键即可验证当前XML文档是否有效。在Stylus Studio中则可以单击XML编辑界面上的按钮验证文档是否格式良好,如图2.2所示。
图2.2 格式不良好的XML文档
2.1.2 格式良好但无效的XML文档
如果一个文档完全遵守XML文档规则,但没有使用DTD或Schema来定义语义约束,那么它就是格式良好但无效的XML文档。不仅如此,即使使用DTD或Schema定义了语义约束,但如果并未遵守这种语义约束,则也是格式良好但无效的XML文档。
例如我们对上面的XML文档进行修改,让其遵守基本的XML文档规则,修改之后的XML文档代码如下:
程序清单:codes\02\2.1\well-formed.xml
格式良好但无效的XML文档可以在浏览器中查看,图2.3所示是上述文档在Internet Explorer中的浏览结果。
图2.3 格式良好的XML文档的浏览结果
在XMLSpy中按F7键可验证当前文档是否为格式良好的XML文档。
格式良好但无效的XML文档已经是一份结构化的文档,因此可以将其转换为树状结构,Stylus Studio提供了这种功能,单击XML编辑界面下方的“树”Tab页,即可看到该文档所对应的树状结构,如图2.4所示。
图2.4 格式良好但无效的XML文档可转换为树状结构
如果为格式良好但无效的XML文档指定了更详细的语义约束,而且该文档也遵守该语义约束,那么这份XML文档就变成了有效的XML文档。
2.1.3 有效的XML文档
一个文档如果完全遵守XML文档的基本规则,并显式使用DTD或Schema指定了详细的语义约束,而且该文档完全遵守DTD或Schema所指定的语义约束,那么它就是有效的XML文档。下面的XML文档是对上述格式良好的XML文档的改进,该文档使用了内部DTD对XML文档做进一步的语义约束,且该文档完全遵守这种语义约束,因此是有效的XML文档。
程序清单:codes\02\2.1\valid.xml
通过上面的介绍可以看出,成为有效的XML文档需要满足3个条件:① 必须是格式良好的;② 必须使用Schema或DTD指定了语义约束;③ 必须遵守Schema或DTD所指定的语义约束。
有效的XML文档是比较实用的XML文档。虽然XML允许开发者自己定义标签,但不管是使用XML文档作为配置描述文件,还是作为数据交换工具,都需要除了满足基本语法规则之外,还满足更详细的语义约束——这样,XML文档的处理程序才能更好地理解XML文档中所包含的信息。