W3CXMLSchema教程XMLSCHEMA教程本教程是笔者学习W3C的《XMLSchemaTutorial》的笔记。如果你对原教程感兴趣,可以浏览。XMLSchema是W3C制定的基于XML格式的XML文档结构描述标准。作为一种文档描述语言,通常我们将其简写为XSD(XMLSchemaDefine)。XSD作为DTD(文档类型定义)的替代者,已经广泛地应用到各种商业应用。使用XSD,我们不仅可以描述XML文档的结构以便颁布业务标准,而且可以使用支持XSD的通用化XML解析器对XML文档进行解析并自动地检查其是否满足给定的业务标准。应用XSD校验XML文档的结构后,我们不仅验证了XML文档的有效性(Well-FormedDocument),还验证了XML文档的合法性,甚至验证了XML文档各域的值合法性(数据类型与编码值),而且这些验证工作不必我们编写任何代码,只需使用支持XSD的通用化XML文档解析器即可完成。这就给应用软件带来了巨大的灵活性,以前需要借助数据库或配置文件才能完成的参数化管理,现在只需按照新的业务需求发布新的XMLSchema即可。作为一个入门,下面列出一个XML文档及其XSD文档,使我们对XSD有个简单的认识:XML:?xmlversion=1.0?notexmlns==:schemaLocation=!/body/noteXSD:?xmlversion=1.0?(1)xs:schemaxmlns:xs=(2)targetNamespace===qualifiedxs:elementname=note(3)xs:complexType(4)xs:sequence(5)xs:elementname=totype=xs:string/(6)xs:elementname=fromtype=xs:string/(7)xs:elementname=headingtype=xs:string/(8)xs:elementname=bodytype=xs:string/(9)/xs:sequence/xs:complexType/xs:element/xs:schema说明如下:(1)?xmlversion=1.0ncoding=UTF-8?XML文档定义,描述本文档使用的XML标准版本及文档编码标准。(2)xs:schemaxmlns:xs====qualifiedxs:schema是所有XSD文档的根元素,其属性描述文档的名空间及文档引用;xmlns:xs=指示使用xs:作前缀的元素、属性、类型等名称是属于名空间的。targetNamespace=指示本文档定义的元素、属性、类型等名称属于名空间;xmlns=,即没有前缀的元素、属性、类型等名称是属于该名空间的。elementFormDefault=qualified指示使用本XSD定义的XML文档所使用的元素必须在本文档中定义且使用名空间前缀。(3)xs:elementname=note定义一个元素,该元素的名称是note,即XML中的note;(4)xs:complexTypenote元素的类型是复杂类型,具体格式由子元素定义;(5)xs:sequencenote元素的子元素必须按顺序出现。具体的顺序由子元素的定义顺序决定;(6)xs:elementname=totype=xs:string/定义一个元素to,其类型是string,且其是note的第1个子元素;(7)xs:elementname=fromtype=xs:string/定义一个元素from,其类型是string,且其是note的第2个子元素;(8)xs:elementname=headingtype=xs:string/定义一个元素heading,其类型是string,且其是note的第3个子元素;(9)xs:elementname=bodytype=xs:string/定义一个元素body,其类型是string,且其是note的第4个子元素;上面的说明可以看出我们描述的XML文档应满足这些要求:根元素是note;note可以包含四个子元素,分别是to、from、heading、body,且必须按to、from、heading、body的顺序出现;四个子元素都是string类型的。1格式良好文档满足下列要求的XML文档,称为格式良好的文档(Well-FormedDocument):(1)使用XML定义打头,如:?xmlversion=1.0encoding=UTF-8?;(2)文档仅包含一个唯一的根元素;(3)起始标记(xxx)必须与结束标记(/xxx)匹配;(4)大小写敏感;(5)所有元素是闭合的(必须与配套);(6)所有元素嵌套是正确的;(7)所有属性使用或’’括;(8)entitiesmustbeusedforspecialcharacters。应注意到,满足上述要求的文档只能算是有效的文档,但不能算是合法的文档。例如,业务标准要求文档中必须包含5个SEG元素,如果文档中仅包含了4个,它仍是格式良好的文档,但不满足业务标准要求,是一个非法的文档。2XSD应用的场合(1)定义文档中可以出现的元素;(2)定义文档中可以出现的属性;(3)定义元素包含哪些子元素;(4)定义元素出现的顺序;(5)定义元素出现的次数;(6)定义哪些元素是空或可以包含text;(7)定义元素与属性的数据类型;(8)定义元素与属性的缺省值或固定值或值范围、值列表。3XSD相对于DTD的优势(1)XSD支持数据类型;易于描述许可的文档组成;易于校验数据的合法性;易于使用数据库中的数据;易于定义数据的约束;易于定义数据的模式;易于在不同数据类型间进行格式转换(2)XSD使用XML语法;(3)XSD使数据交换更安全,因为它描述了数据的格式,避免了歧义;(4)XSD可以扩展,支持类型的扩展和结构的扩展。4文档引用XSD支持名空间(NameSpace)和文档引用。通过名空间,可以避免文档引用中可能导致的名称重复问题。W3C规定XSD的名空间使用URI作为名称。以前面的XML为例:notexmlns==:schemaLocation=xmlns=指示本文档缺省的名空间,即没有前缀的所有的元素应在该空间中定义;xmlns:xsi=指示本文档要引用名空间定义的名称,其前缀是xsi;xsi:schemaLocation=名空间的XSD文档是note.xsd。如果要引用多个名空间的XSD文档,则使用空格分隔多个‘Namespacexsd’对。例如:。如果XSD文档没有使用名空间,则使用xsi:noNamespaceSchemaLocation=note.xsd代替xsi:schemaLocation。5简单元素描述简单元素指只包含text的XML元素,它没有任何子元素或属性,如:sex男/sex。简单元素可以附加地定义其缺省值或固定值。XSD定义简单元素的格式是:xs:elementname=xxxtype=ttt[default=defval][fixed=fixedval]。其中ttt使用XSD标准定义的基本类型,即:xs:string、xs:decimal、xs:integer、xs:boolean、xs:date、xs:time等。例如:xs:elementname=”sex”type=”xs:string”default=”男”。使用上述方式定义的简单元素只能限定元素的数据类型、缺省值、固定值。如果希望限定该简单元素的取值范围等约束,则应使用简单类型定义,并在简单类型中嵌套值约束子元素。如:xs:elementname=sexxs:simpleTypexs:restrictionbase=xs:stringxs:enumerationvalue=男/xs:enumerationvalue=女//xs:restriction/xs:simpleType/xs:element其中,约束的定义方式参考第6节。6复杂元素描述复杂元素指包含属性或子元素的XML元素,如:studentname=”Li”sex=”男”,主要包括下列四类:空元素:只包含属性的元素。如:studentname=”li”/;只包含属性与子元素的元素。如:nametype=”realname”firstnameJack/firstnamelastnameTom/lastname/name只包含属性与text的元素。如:nametype=”firstname”Jack/name只包含属性、text和子元素的元素。如:nametype=”realname”Yournameis:firstnamexxx/firstnamelastnamexxx/lastname/name复杂元素是一种复杂类型,可以使用下面两种描述方式,一是复合结构,二是分离结构。复合结构,则直接将复杂类型定义为复杂元素的子元素;分离结构则是将复杂类型定义在外部,由复杂元素引用。复合结构xs:elementname=xxxxs:complexType.../xs:complexType/xs:element分离结构xs:elementname=xxxtype=”yyy”/xs:complexTypename=”yyy”.../