3XML模式语言XMLSchema文档类型定义DTD是面向SGML语言的规范,在描述XML数据模式时不可避免地存在很多限制(比如缺少数据类型和命名空间的支持、语法规则过于简单以至描述能力有限、使用了非XML的格式等等)。本章将介绍专门用于XML数据建模的语言规范(以下称为XML模式语言)。3.1XML模式语言XML模式语言是指用来描述XML结构、数据内容、相关约束等方面特征的语言。XML模式语言的种类很多:ISOSchematronXDR(XML-DATAReduced)XMLSchemaRELAXNG一种非常独特的XML模式语言,无论是结合其他模式语言或者单独使用都具有强大的功能。Schematron语言允许直接表达规则,而不需要创建完整的语法基础设施。是由Microsoft公司提出的XML简化模式语言,作为W3C在讨论XMLSchema工作草案过程中提出的一种过渡性Schema语言,XDR已经被业界普遍认可,得到许多产品(例如,MS-BiztalkServer、MS-SQLServer、MS-Office)的广泛支持。W3C的正式推荐标准,提供了XML模式声明的完整语法、丰富的数据结构等,目前已成为应用最广泛的XML模式语言。一种基于语法的XML模式语言,可用于描述、定义和限制XML词汇表。它以简洁性和表达能力著称,并且具有良好的可扩展性。XMLSchema的特征1与DTD相比,XMLSchema具有特征:一致性:XMLSchema利用XML的基本语法规则来定义其文档结构,从而使XML的模式和实例定义达到统一;继承了XML的自描述性和可扩展性,使其更具有可读性和灵活性。完备性:XMLSchema对DTD进行了扩充,引入了数据类型、命名空间,并且支持对其他XMLSchema的引用,从而使其具备较强的模块性;规范性和准确性:XMLSchema提供了更加规范和完备的机制来约束XML文档。XMLSchema的语义更加准确,可以完成一些DTD不能完成的定义,如对元素出现次数的约束等。XMLSchema的特征2面向对象特征:XMLSchema中引入了许多成熟的面向对象机制(比如继承性和多态性),使得数据模式在应用中更加灵活。扩展性:DTD所描述的文档结构是非常严格的(closed),没有显式声明的内容绝不允许在XML实例数据中出现;而XMLSchema则提供了一些扩展机制(open),允许在事先无法准确描述数据模式的情况下,在XML实例数据中根据需要添加相关的数据。3.1.2XMLSchema的一个简单示例student.xsdXMLSchema文件的后缀名通常为.xsdXMLSchema文件是一个特殊的XML文件。注意根元素及命名空间指定xmlschema语义约束的命名空间。实例XML文档查看示例student.xsd实例XML文档?xmlversion=1.0encoding=UTF-8?studentxsi:noNamespaceSchemaLocation=student.xsdxmlns:xsi=男/genderno123/notelephone010-12345678/telephonegpa80/gpa/student在xmlspy中与当前文件夹中的student.xsd相关联查看示例student.xmlXMLSchema中的“注释”元素在W3CXMLSchema文件中,推荐使用xsd:annotation元素来增加注释内容,xsd:annotation元素可以包含两个子元素xsd:appinfo和xsd:documentation。前者用于表示计算机应用程序处理的注释,而后者则表示供开发人员阅读的注释。这两个子元素是W3CXMLSchema中唯一的混合内容模型的元素,其中可以包含任何文本和子元素。3.2XMLSchema中的数据类型元素是其中最为重要的组成部分,一个XML文档中可能不包含任何属性或者文本数据,但是必须包含元素(至少包含一个根元素)。XMLSchema中的数据类型实际上主要是针对XML元素而言的,换句话说,是针对各种元素的内容及其结构的。productpid=1345/foodtype=dessertIcecream/foodlastnameJack/lastnamedescription/元素的类型在W3C的XMLSchema规范中,将元素分为两类:简单类型:不包含任何子元素和属性的元素。换句话说,简单类型的元素只能包含文本内容,或者为不包含属性的空元素(文本内容为空)。复杂类型:包含子元素和/或属性的元素(其中属性的声明包含在元素的复杂类型定义中)。有关元素类型的说明简单类型元素只能包含文本内容,而复杂类型元素除了包含子元素和/或属性之外,也可以包含文本内容。“文本内容”并不是指的字符串数据类型,在XMLSchema规范中定义了44种简单数据类型,“文本内容”可以是这些简单数据类型中的任何一种(甚至还可以是派生的简单数据类型)。比如:xsd:elementname=“orderid”type=“xsd:integer”/。orderid1032/orderid正确orderidabc/orderid错误•anySimpleType是所有简单数据类型的基础类型。•anySimpleType也是一种实际的、可用的数据类型,它是所有简单数据类型的根节点,与anyType不同的是,它只能表示标量数据。•比如:elementname=Currencytype=anySimpleType/CurrencyUSD/CurrencyCurrencydollars100/dollars/Currency•anyType是XMLSchema中所有数据类型(包括简单类型和复杂类型、内置数据类型和用户定义数据类型)的基础类型,如果拿Java语言来做个类比,那么xsd:anyType类似于Java中的java.lang.Object。•anyType分为“简单类型”和“复杂类型”。•anyType是一种实际的、可用的数据类型,而不仅仅只是在XMLSchema数据类型层次结构中作为抽象的根节点。比如:elementname=Currencytype=anyType/CurrencyUSD/CurrencyCurrencydollars100/dollars/Currency3.2.1XMLSchema的内置数据类型•内置基本数据类型(PrimitiveDatatype):这些类型是独立存在的,而不是在其他数据类型的基础上定义的。比如数学上的十进制数,定义为decimal。•在XMLSchema规范中,一共定义了19种内置的基本数据类型,它们可以单独使用、或者作为其他派生数据类型(包括内置派生数据类型和用户派生数据类型)的基础类型。•内置派生数据类型(DerivedDatetype):这些内置类型的定义依赖于其他的数据类型(即内置基本数据类型)。•比如decimal和nonNegativeInteger,可以将后者理解为满足某种条件(非负整数)的decimal,实际上,decimal是XMLSchema中所有十进制数值类型的基础类型。p57常用数据类型(字符串类型)字符串类型stringstring数据类型的取值可以是任意字符串,其中可以包含空格、换行、回车和制表符等空白字符。对于string数据类型,XML解析器将不会修改其内容。normalizedStringnormalizedString数据类型派生于string数据类型。normalizedString数据类型的值可以包含任意字符,但是XML解析器将删除其中的换行、回车和制表符等空白字符;换句话说,normalizedString数据类型是不包含上述特殊字符的字符串。tokentoken数据类型也是string数据类型的派生类型,其中可以包含任意字符,但是XML解析器将删除其中的换行、回车和制表符等空白字符、开头和结尾的空格、以及连续的空格。language包含合法语言id的字符串。Name包含合法XML名称的字符串,可以包含命名空间前缀。NCName包含合法XML名称的字符串,不可以包含命名空间前缀。ID、IDREFS、NMTOKEN等这些数据类型来自于DTD,在XMLSchema中保留了这些数据类型,并且与DTD中的使用方式相同,这些类型只能用于元素的属性。......常用数据类型(数值类型)数值类型floatIEEE的单精度32位浮点数。decimal可以使用十进制数字表示的实数。integer派生于decimal,限制条件是十进制整数。long派生于integer,限制条件是最大值为9223372036854775807、最小值为-9223372036854775808。int派生于long,限制条件是最大值为2147483647、最小值为-2147483648。nonPositiveInteger派生于integer,限制条件是最大值为0。......常用数据类型(日期、时间和其他类型)日期、时间类型date用于指定一个日期,具体格式为:YYYY-MM-DD,其中:YYYY表示年;MM表示月;DD表示日。假如xsd:elementname=starttype=xsd:date/,那么该元素可以为start2002-09-24/start。time用于指定一个时间,具体格式为:hh:mm:ss,其中:hh表示时;mm表示分;ss表示秒。假如xsd:elementname=starttype=xsd:time/,那么该元素可以为start09:00:00/start。datetime用于指定一个日期和时间,具体格式为:YYYY-MM-DDThh:mm:ss。假如xsd:elementname=startdatetype=xsd:dateTime/,那么该元素可以为startdate2002-05-30T09:00:00/startdate。duration指定一个时间间隔,具体格式为:PnYnMnDTnHnMnS,其中:P表示时间间隔(必需的);nY表示年数;nM表示月数;依次类推。其他类型boolean用于指定true或者false。合法的取值包括:true、false、1(表示true)、0(表示false)。base64Binary、hexBinary用于表示二进制格式的数据,base64Binary表示Base64编码的二进制数据,hexBinary表示十六进制编码的二进制数据。anyURI用于表示一个URI,如果其中包括空格,必须使用%20进行替换。3.2.2XMLSchema中的派生简单数据类型仅使用44种基本数据类型仍然是不够的。比如,假设希望定义一个email数据类型、或者telephone数据类型,用于约束合法的email和telephone数据,那又该怎么做呢?XMLSchema为此提供了自定义简单数据类型、复杂数据类型的机制,以便用户在需要的时候对XMLSchema类型系统进行扩充。可以通过几种不同的方法(通过限制、列表、或者组合)自定义简单数据类型。1.通过限制(restriction)派生简单数据类型通过限制的方式派生简单数据类型的语法格式如下所示,下面的两种形式分别声明了一个无名的、以及一个命名的(名为SimpleTypeName)简单数据类型:xsd:simpleTypexsd:restrictionbase=BaseType...facetsdescriptions.