什么是XML Schema
XML Schema犹如DTD一样是担任定义和形貌XML文档的组织和内容情势。它可以定义XML文档中存在哪些元素和元素之间的关联,而且可以定义元素和属性的数据范例。
XML Schema自身是一个XML文档,它相符XML语法组织。可以用通用的XML剖析器剖析它。
为何要运用Schema
我们前面已运用DTD来定义一个XML的组织和数据范例,那为何还要Schema呢?
因DTD有着不少瑕玷:
1) DTD是基于正则表达式的,形貌才能有限;
2) DTD没有数据范例的支撑,在大多数运用环境下才能不足;
3) DTD的束缚定义才能不足,没法对XML实例文档作出更仔细的语义限定;
4) DTD的组织不够组织化,重用的价值相对较高;
5) DTD并不是运用XML作为形貌手腕,而DTD的构建和接见并没有规范的编程接口,没法运用规范的编程体式格局举行DTD保护。
而XML Schema恰是针对这些DTD的瑕玷而设想的,XML Schema的长处:
1) XML Schema基于XML,没有特地的语法
2) XML可以象其他XML文件一样剖析和处置惩罚
3) XML Schema支撑一系列的数据范例(int、float、Boolean、date等)
4) XML Schema供应可扩大的数据模子。
5) XML Schema支撑综合定名空间
6) XML Schema支撑属性组。
一个简朴的XML Schema文档
在这个Schema内里定义了一个元素:quantity,它的范例是nonNegativeInteger(非负整数),xmlns是Schema的定名空间,这在前面第3部份已叙说过了。
下面的XML片断是正当的:
<quantity>5</quantity>
下面的XML片断是不法的:
<quantity>-4</quantiy>
Schema中的范例
Schema中重要包括三种部件:元素(element)、属性(attribute)、解释(notation)。
这三种基础的部件还能组合成以下的部件:
a)范例定义部件: 简朴范例和复合范例
b)组部件
c)属性组部件
简朴范例
XML Schema中定义了一些内建的数据范例,这些范例可以用来形貌元素的内容和属性值。
一个元素中假如仅仅包括数字、字符串或其他数据,但不包括子元素,这类被称为简朴范例。
犹如图中元素quantity就是一个简朴范例。它的元素内容必需黑白负整数,不包括任何属性和子元素。
<quantity>some</quantity>
一切内建的简朴范例
原始范例
string,boolean,decimal,float,double,duration datetime,time,date,gYearMonth,gYear,gMonthDay, dDay,gMonth,hexBinary,base64Binary,any URI,QName NOTATION
衍生范例(括号中为基范例)
normalizedString(string),language(tonken),token(normalizedString) NMTOKEN(token),Name(token),NCName(Name),ID(NCName),IDREF(NCName) IDREFS(list of IDREF),ENTITY(NCName),ENTITIES(list of ENTITY) integer(decimal),nonPositiveInteger(integer), negativeInteger(noPositiveInteger),long(integer),int(long), short(int),byte(short),nonNegativeInteger(integer) unsignedLong(nonNegativeInteger),unsignedInt(unsignedLong), unsignedShort(unsignedInt),unsignedByte(unsignedShort), positiveInteger(nonNegativeInteger)
竖立简朴范例
图中我们先竖立了一个简朴范例:quantityType,它是从integer继续过来的,minInclusive和maxInclusive定义了它的最小值2和最大值5。末了我们定义元素quantity的范例为quantityType。
准确: <quantity>3</quantity> 毛病: <quantity>10</quantity> <qauntity>aaa</quantity>
运用restriction我们可以限定只能接收肯定数值或许只能接收肯定笔墨,
基础方面:equal,ordered,bounded,cardinality,numeric 限定方面:length,minLength,maxLength pattern,enumeration whiteSpace maxInclusive,maxExclusive,minInclusive,minExclusive totalDigits,fractionDigits
简朴范例的例子 1
这个SKU的范例的取值:3个数字背面根着一个连字号接着随着两个大写的英笔墨母。
pattern背面跟的是正则表达式。有关正则表达式的语法请参阅其他书本。
准确: <ourSKU>123-AB</ourSKU> 毛病: <ourSKU>abc-AB</ourSKU> <ourSKU>123-ab</ourSKU>
简朴范例的例子 2
这是一个用来形貌美国州名的范例USState,经由过程enumeration来列出一切州名,取值时就只能取内里列出的州名。
<!-- and so on ...-> 这是一个解释语句。
准确: <statename>AK</statename> 毛病: <statename>Alaska</statename>
列表范例
list可以用来定义列表范例,listOfIntType这个范例被定义为一个Integer的列表,元素listOfMyInt的值可以几个整数,他们之间用空格离隔。
准确: <listOfMyInt>1 5 15037 95977 95945</listOfMyInt> 毛病: <listOfMyInt>1 3 abc</listOfMyInt>
团结范例
图顶用union来定义了一个团结范例,内里的成员范例包括USState和listOfMyIntType,运用了团结范例的元素的值可以是这些原子范例或列表范例中的一个范例的实例,然则一个元素实例不能同时包括两个范例。
准确: <zips>CA</zips> <zips>95630 95977 95945</zips> <zips>AK</zips> 毛病: <zips>CA 95630</zips>
匿名范例定义
前面我们在定义元素范例时老是先定义一个数据范例,然后再把元素的type设成新定义的数据范例。假如这个新的数据范例只会用一次,我们就可以直接设置在元素定义内里,而不必另外来设置。如图中元素quantity的范例就是一个从1到99的整数。
这类新的范例没有本身的名字的定义要领我们称之为匿名范例定义。
复合范例
前面我们所讲到的都是属于简朴范例,即元素内里只要内容,不再包括属性或许别的元素。接下来我们要让元素内里包括属性和别的元素,称之为复合范例。
图中我们用complexType示意这是一个复合范例(这里我们是用匿名范例定义的)。simpleContent示意这个元素下面不包括子元素,extension示意这个元素值是decimal的,attribute来设置它的一个属性currency,范例为string.
准确:<internationalPrice currency="EUR">423.46</internationalPrice>
夹杂内容
一样,我们采用了匿名范例体式格局来定义一个元素salutation。我们注意到在complexType背面多了一个mixed="true",这表明这是一个夹杂范例:内里既有元素自身的内容,又有别的子元素。name元素就是salutation的子元素。
准确: <salutation>Dear Mr.<name>Robert Smith</name>.</salutation> 毛病: <salutation>Dear Mr.</salutation>
sequence示意子元素涌现的递次要和schema内里的递次一样。我们在背面还会讲到和sequence对应的choice和all两种体式格局。
空内容
有的时刻元素基础没有内容,他的内容模子是空。为了定义内容是空的范例,我们可以经由过程如许的体式格局:起首我们定义一个元素,它只能包括子元素而不能包括元素内容,然后我们又不定义任何子元素,依托如许的体式格局,我们就可以定义出内容模子为空的元素。
图中complexConet示意只包括子元素,然后我们定义了两个属性currency和value,然则却不定义任何子元素。
准确: <internationalPrice currency="EUR" value="423.46"/> 毛病: <internationalPrice currency="EUR" value="423.46"> Here is a mistake! </interanationPrice>
还要更简约的要领定义:
<xsd:element name="internationalPrice"> <xsd:complexType> <xsd:attribute name="currency" type="xsd:string"/> <xsd:attribute name="value" type="xsd:decimal"/> </xsd:complexType> </xsd:element>
由于一个不带有simpleContent 或许complexContent的复合范例定义,会被解释为带有范例定义为anyType的complexContent,这是一个默许的速记要领,所以这个简约的语法可以在情势处置惩罚器中事情。
anyType
一个anyType范例不以任何情势束缚其包括的内容。我们可以象运用其他范例一样运用anyType,如图第一个语句,这个体式格局声明的元素是不受束缚的。所以元素的值可认为423.46,也可认为任何其他的字符序列,或许以至是字符和元素的夹杂。实际上,anyType是默许范例,所以上面的可以被重写为第二个语句。
假如须要示意不受束缚的元素内容,举例来说在元素包括散文,个中能够须要嵌入标签来支撑国际化的示意,那末默许的声明(无束缚)或许有些微束缚的情势会很适宜。
解释
为了轻易其他读者和运用来明白情势文档,XML Schema供应了三个元素用来解释。
annotation documentation appinfo
图中,我们在documentation元素中安排了一个基础的情势形貌和版权信息,这是安排合适人浏览的信息的引荐位置。我们引荐你在任何的documentation元素中运用xml:lang属性来示意这些形貌信息运用的言语。
组织内容模子
图中,我们在purchaseOrderType定义中引入两个元素组定义,购置定单就可以有两种挑选来形貌地点:第一种是包括相互自力的送货地点和收款地点,第二种状况则是仅包括一个简朴的地点,这个地点等于送货地点也是收款地点.
关于choice组元素而言,在实例中仅仅许可涌现这个组中的一个子内容。关于图中的例子而言,第一个子内容是一个内部group元素,援用以shipAndBill定名的元素组,这个元素组由元素序列shipTo、billTo构成。第二个子内容为singleUSAddress。因而,在一个实例文档中,purchaseOrder元素必需,要么包括一个billTo元素和一个shipTo元素,要么包括一个singleUSAddress元素。
choice组背面随着的是comment和items元素声明。元素和组的声明都是sequence 组的子内容。如许定义的结果是comment和items元素必需按递次跟在地点元素背面。
在内容模子中被定名或未被定名的元素组(分别由group、choice、sequence、all所表现)可以带有minOccurs 和maxOccurs属性
属性组
我们可以竖立一个被定名的属性组来包括一切item元素所希冀的属性,而且在item元素声明中经由过程名字来援用这个属性组ItemDeleivery
经由过程这类要领来运用属性组,可以进步情势文档的可读性,同时也便于更新情势文档。这是由于一个属性组可以在一个处所定义和编辑,同时可以在多个定义和声明中被援用。注意到一个属性组可以包括其他属性组,同时还要注意到属性组的声明和援用必需在复合范例定义的末了。
空值(Nil)
XML Schema 空值机制包括一个空值信号。换句话说,作为元素内容而言,并没有无真正的空值,代之的是一个申明元素的内容是空值的属性。为了显现这点,我们修正shipDate元素的声明,如许空值就可以被明白地示知用户了。
<xsd:element name="shipDate" type="xsd:date" nillable="true"/>
为了在实例文档中明白的示意shipDate有一个空值,我们可以设置nil属性为真:
<shipDate xsi:nil="true"></shipDate>
解释
为了轻易其他读者和运用来明白情势文档,XML Schema供应了三个元素用来解释。
annotation documentation appinfo
图中,我们在documentation元素中安排了一个基础的情势形貌和版权信息,这是安排合适人浏览的信息的引荐位置。我们引荐你在任何的documentation元素中运用xml:lang属性来示意这些形貌信息运用的言语。
组织内容模子
图中,我们在purchaseOrderType定义中引入两个元素组定义,购置定单就可以有两种挑选来形貌地点:第一种是包括相互自力的送货地点和收款地点,第二种状况则是仅包括一个简朴的地点,这个地点等于送货地点也是收款地点.
关于choice组元素而言,在实例中仅仅许可涌现这个组中的一个子内容。关于图中的例子而言,第一个子内容是一个内部group元素,援用以shipAndBill定名的元素组,这个元素组由元素序列shipTo、billTo构成。第二个子内容为singleUSAddress。因而,在一个实例文档中,purchaseOrder元素必需,要么包括一个billTo元素和一个shipTo元素,要么包括一个singleUSAddress元素。
choice组背面随着的是comment和items元素声明。元素和组的声明都是sequence 组的子内容。如许定义的结果是comment和items元素必需按递次跟在地点元素背面。
在内容模子中被定名或未被定名的元素组(分别由group、choice、sequence、all所表现)可以带有minOccurs 和maxOccurs属性
属性组
我们可以竖立一个被定名的属性组来包括一切item元素所希冀的属性,而且在item元素声明中经由过程名字来援用这个属性组ItemDeleivery
经由过程这类要领来运用属性组,可以进步情势文档的可读性,同时也便于更新情势文档。这是由于一个属性组可以在一个处所定义和编辑,同时可以在多个定义和声明中被援用。注意到一个属性组可以包括其他属性组,同时还要注意到属性组的声明和援用必需在复合范例定义的末了。
空值(Nil)
XML Schema 空值机制包括一个空值信号。换句话说,作为元素内容而言,并没有无真正的空值,代之的是一个申明元素的内容是空值的属性。为了显现这点,我们修正shipDate元素的声明,如许空值就可以被明白地示知用户了。
<xsd:element name="shipDate" type="xsd:date" nillable="true"/>
为了在实例文档中明白的示意shipDate有一个空值,我们可以设置nil属性为真:
<shipDate xsi:nil="true"></shipDate>
以上就是XML Schema全接触的图文代码详解的细致内容,更多请关注ki4网别的相干文章!