XML 的两种主要验证机制
2015-07-13陈娟
陈娟
摘要:为保证标准通用标记语言、可扩展标记语言文档格式正确,可通过验证判断文档是否有效。验证是把 XML 文档的结构、标记名称、数据类型等与预先设定的要求作比较的过程。预先设定的要求被保存在模式文档中。W3C标准制定了两种XML的验证机制(模式文档):DTD(Document Type Definition)和XSD(XML Schema Definition)。
关键词:验证; XML; W3C; DTD; XSD
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2015)13-0082-02
Abstract: In order to ensure the standard generalized markup language, extensible markup language document format is correct, can be verified by the judgment document is valid. Verification is the structure, the tag name, data type of XML document and the preset requirements for comparison process. The preset requirements are stored in the document model. W3C standard authentication mechanism of two kinds of XML (schema) :DTD(Document Type Definition)和XSD(XML Schema Definition)。
Key words: verification; XML; W3C; DTD; XSD
1 问题的提出
XML在数据描述过程中,用户可以自定义数据的结构,因此,在使用XML文档之前需要对数据进行筛选,防止无效的数据出现,以确保数据的结构标准化。不同的用户只需定义好标准文档类型定义,各用户都能依文档类型定义建立文档实例,并且进行验证,如此就可以轻易的建立标准和交换数据,这样满足了网络共享和数据交互。一般教材中会提到两种验证机制:DTD 和 XSD。
2 DTD验证
文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。是一套关于标记的语法规则,它说明了在XML文档中可以使用哪些标记,哪些标记具有属性,以及所使用的标记出现的顺序是什么。DTD的文件格式是SGML,因此我们在学习DTD语法时需区分它与XML语法规则。在XML文档中的使用DTD主要有三种方式:内部引用、外部引用和内外结合引用。
DTD的定义主要包括在DOCTYPE 声明中,三种方式分别为<!DOCTYPE根元素 [元素声明]> 、<!DOCTYPE根元素 SYSTEM "文件名">、<!DOCTYPE根元素 SYSTEM "文件名" [元素声明]>。在讲授过程中一般建议使用外联方式,这样数据文档与验证文档分开更易维护。
在DTD文档中,可以对源XML文档的元素、属性及元素出现的顺序进行描述,在描述的过程中,包括元素和属性的类型、元素出现的次数等。这里对DTD文档的具体语法就不作详细的介绍了。
3 XSD验证
XML Schema 定义(XML Schema Definition,XSD)是一个XML文档,用于描述另一个XML文档。定义 XML 文档的合法构建模块,类似DTD。它的文件格式是XML。在XML文档中的使用XSD只有一种方式:外联。XSD的引用主要是在XML源文件的根元素中添加noNamespaceSchemaLocation 属性,而该属性所在的命名空间为http://www.w3.org/2001/XMLSchema-instance。例如:
在XSD文档中,对源XML文件的描述所需的元素所在的命名空间为上述URL。根元素是schema,所有对源数据文件的描述都包括在根元素里,在描述过程中,几乎可以实现在DTD中对数据的所有描述,除此之外,对元素出现的次数更具体化。另外,XSD的最大特点就是支持数据类型。XSD标准里有内置的数据类型,而DTD中没有。而正是因为XSD中的数据类型,确保了不同的用户在理解数据同一数据时保持一致。
4 举例分析
下面对名为”shiporder.xml”源XML文档,分别进行两种不同的验证,通过比较它们之前的区别,分别对两种验证机制的语法和用法进行讲解。文档片段如下:
在XML文档中shiporder元素包括三个子元素,其中item元素出现了两次也许更多次,还包括属性orderid;三个子元素又分别包括子元素。在DTD中描述时,shiporder的描述<!ELEMENT shiporder (shipto,item*)>,圆括号中的列表可以确定其子元素出现的顺序,而“item”后面的“*”表示item元素出现的次数是零次或者多次,而不能确定具体的次数;在XSD中描述时,对于有子元素的这类元素,通常用complexType元素来描述其结构,在该元素中通过使用三种控制器即:all、sequence、choice来控制子元素结构。其中sequence来控制子元素的顺序。例子中通过maxOccurs属性来确定元素出现的最大次数。而这个属性在all控制器中,其值只能是“0”或者“1”,其它两种控制器该值可以任意设置,与maxOccurs属性对应的属性minOccurs,在sequence控制器中其值只能是“1”。通过这两个属性的设置可以限制子元素出现的最小和最大次数,且次数的具体值可以确定。另外,在描述类型的过程中,DTD描述数据时,仅限于抽象的类型,譬如“#PCDATA”、“CDATA”,它们分别用于描述元素和属性的文本类型,像元素quantity,属性orderid它们只能被描述为文本类型,但是在XSD中,它们分别被描述成string、integer。当然,XSD中对数据类型的描述不仅仅只有内置类型,可以通过在simpleType元素中的restriction元素来对数据类型作更具体的描述,譬如对数据的长度、数据的模式、数据的范围等。
XSD描述中结构和类型可以自定义并且重用。源XML文件中的元素根据其结构不同,一般分成两种:1)无属性且无子元素的元素;2)有属性或者有子元素的元素。在XSD描述中,分别使用上述提到的simpleType元素和complexType元素来进行具体的定义,这两个元素都包含name属性,通过对该属性赋值来分别为两种结构命名。这样在XSD描述过程中,出现与该结构相同的描述,我们可以直接通过name的名字来直接引用。而这种类型的描述在DTD中是无法实现的。
5 总结
上述通过一个简单的例子对XML中的两种验证机制,从文档格式、描述的语法进行了分析和比较,突出了XSD中对数据类型的描述特点。可以看出XML Schema 是基于 XML 的 DTD 替代物。XSD弥补的DTD中的很多不足之处,而今也被用在大部分的网络应用程序中。
参考文献:
[1] David Hunter,Jeff R.XML入门经典[M]. 4版. 北京: 清华大学出版社, 2009.
[2] 马在强. XML实用教程[M]. 北京: 清华大学出版社, 2008.
[3] Dr Shahram Khosravi.ASP.NET 2.0服务器控件与组件开发高级编程[M]. 北京: 人民邮电出版社, 2007.
[4] 韩忠明. XML数据查询与信息检索系统[M]. 北京: 中国水利水电出版社, 2013.
[5] 李秋云, 郝建国. XML及WAP开发手册[M]. 北京: 人民邮电出版社, 2002.