首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > XML SOAP >

懂得XML Schema: XML Schema 初步 (I)

2012-10-17 
理解XML Schema: XML Schema 初步 (I)转载自:http://www.ibm.com/developerworks/cn/xml/x-schema/part1/i

理解XML Schema: XML Schema 初步 (I)

转载自:http://www.ibm.com/developerworks/cn/xml/x-schema/part1/index.html

?

?

XML Schema是W3C的推荐标准,于2001年5月正式发布,经过数年的大规模讨论和开发,终于最终奠定下来,使得XML建模有了一个国际标准。XML Schema一确定下来,立刻成为全球公认得首选XML环境下的建模工具,已经基本取代了DTD在XML刚刚成为W3C推荐标准时的地位。由于XML是SGML的一个子集,因此它也继承了SGML世界中用于建模的DTD,当时使用DTD的好处是可以利用大量的在SGML世界中现有的DTD工具,使得开发应用代价维持在一个相对较低的水平。然而,DTD有着不少缺陷:1)DTD是基于正则表达式的,描述能力有限;2) DTD没有数据类型的支持,在大多数应用环境下能力不足;3) DTD的约束定义能力不足,无法对XML实例文档作出更细致的语义限制;4) DTD的结构不够结构化,重用的代价相对较高;5)DTD并非使用XML作为描述手段,而DTD的构建和访问并没有标准的编程接口,无法使用标准的编程方式进行DTD维护。而XML Schema正是针对这些DTD的缺点而设计的,XML Schema是完全使用XML作为描述手段,具有很强的描述能力、扩展能力和处理维护能力。

XML Schema的主要目的是用来定义一类XML文档(一个XML Application)。因此模式的"实例文档"形式常常用来描述一个与特定XML Schema相一致的XML文档。事实上,文档实例和Schema文档都不是必须要以文档的形式存在,他们可以存在以于应用之间传递的字节流的形式存在,或者作为一个数据库记录或者作为XML的"信息项"的集合而存在。然而为了简化入门,我们总是把实例和模式看作文档或者文件,认为它们总以文档实例或是模式文档的形式存在。让我们开始考虑一个在文件po.xml中的实例文档。它描述了一个由家庭产品采购和支付应用生成的购买订单。

?

购买订单模式文档由一个schema元素和一系列子元素组成,大多数子元素为element, complexType, 和simpleType,这些决定了在实例文档中的元素的表现方式和内容。

通过出现在schema元素中的命名空间声明xmlns:xsd="http://www.w3.org/2001/XMLSchema",在模式文档中的每一个元素都有一个与XML Schema命名空间相联系的命名空间前缀"xsd:"。尽管任何前缀都能够被使用,但是,前缀"xsd:"被约定用于表示XML Schema命名空间。通过使用同样的前缀,这样同样的关联也出现在内置的简单类型的名字中。例如,xsd:string。这种形式的关联的目的是用来标识元素和简单类型是属于XML Schema语言的词汇表而不是模式文档作者自己的词汇表。为了在这里清楚表示,我们仅提及元素的名字和简单类型(如simpleType)而忽略了它们的前缀"xsd:"。

?

这个定义的结果将是,在实例文档中出现的任何类型声明为USAddress的元素(比如在po.xml中的shiptTo)必须包含五个元素和一个属性。这些元素必须被命名为name、street、city、state和zip,这些名称就如同在模式声明中name属性的值所指的那样。并且这些属性必须按照模式声明中的同样的顺序出现。前四个元素必须包含一个字符串元素内容而第五个必须包含一个十进制数字类型的元素内容。声明为USAddress类型的元素可以带有一个country属性,该属性必须包含字符串"US"。

USAddress类型定义仅仅包含引用简单类型的声明:string、decimal 和NMTOKEN。与之对比,PurchaseOrderType类型定义则包含了引用复合类型的元素声明,如USAddress,虽然两个类型声明都使用同样的type属性来标识类型,而无需管类型是简单的还是复合的。

?

在PurchaseOrderType的类型定义中,对于shipTo 和 billTo这两个子元素的声明,它们将不同的元素名字和相同的复合类型相关联,这个复合类型是USAddress。这个定义的结果是,如果在实例文档中出现的任何元素(如po.xml中),当元素类型被声明为PurchaseOrderType时,那么这个元素必须包含两个名为shipTo 和billTo的元素,这两个元素都要包含五个子元素(name、street、city、state和zip),这五个子元素是作为USAddress声明的一部分而出现的。应USAddress的相关类型定义,shipTo和billTo元素也可以包含country属性。

PurchaseOrderType类型定义包含了一个orderDate属性声明,就像在UAAddress中的country属性声明一样,它被标识为一个简单类型,实际上,所有的属性声明必须引用简单类型。这是因为不像元素声明,属性不能包含其他元素或者其他属性。迄今为止我们描述的元素声明对于每一个名字都和一个现存的类型定义相关联。然而有时候,使用一个现存的元素比定义一个新的元素更方便。

?

这个声明定义引用了一个现存的元素comment,该元素在购买订单模式文档中的其他地方有定义。一般的来说,ref属性的值必须指向一个全局元素,一般来说,应当是在下面声明的而不是作为复合类型定义的一部分声明的。这个声明的结果为一个叫comment的元素可以出现在实例文档的关于这个定义的相关部分中,他的内容必须和那个被引用的元素的类型一致,在这个情况下是" string"。

元素 - 使用(minOccurs, maxOccurs) fixed, default属性 - 使用use, fixed, default注解(1, 1) -, -required, -, -元素/属性必须出现一次,它可以有任何值。(1, 1) 37, -Required, 37, -元素属性必须出现一次,他的值为37。(2, unbounded) 37, -无相关描述元素必须出现两次或者多次,他的值必须为37,一般说来,minOccurs 和maxOccurs可以为正数,maxOccurs可以为"unbounded"。(0, 1) -, -optional, -, -元素/属性可以出现一次,他可以有任何值。(0, 1) 37, -optional, 37, -元素/属性可以出现一次,如果出现他的值必须为37,如果不出现他的值为37。(0, 1) -, 37optional, -, 37元素/属性可以出现一次,如果不出现值为37,否则他的值为给出的值。(0, 2) -, 37无相关描述元素可以出现一次、两次或者更本不出现,如果元素不出现,则默认值不发生作用,如果出现并且他为空元素,则其值为37,否则值为实例中给出的值。一般说来,minOccurs 和maxOccurs可以为正数,maxOccurs可以为"unbounded"。(0, 0) -, -prohibited, -, -元素/属性必须不出现。

在这里,值得注意的是,在全局的元素和属性声明中,minOccurs、maxOccurs、use都没有出现。

简单类型值示例备注stringConfirm this is electric normalizedStringConfirm this is electric参见 (3)tokenConfirm this is electric参见 (4)byte-1, 126参见 (2)unsignedByte0, 126参见 (2)base64BinaryGpM7 hexBinary0FB7 integer-126789, -1, 0, 1, 126789参见 (2)positiveInteger1, 126789参见 (2)negativeInteger-126789, -1参见 (2)nonNegativeInteger0, 1, 126789参见 (2)nonPositiveInteger-126789, -1, 0参见 (2)int-1, 126789675参见 (2)unsignedInt0, 1267896754参见 (2)long-1, 12678967543233参见 (2)unsignedLong0, 12678967543233参见 (2)short-1, 12678参见 (2)unsignedShort0, 12678参见 (2)decimal-1.23, 0, 123.4, 1000.00参见 (2)float-INF, -1E4, -0, 0, 12.78E-2, 12, INF, NaN等同于单精度32位浮点数,其中”NaN”表示”不是一个数字”。参见 (2)double-INF, -1E4, -0, 0, 12.78E-2, 12, INF, NaN等同于双精度64位浮点数。参见 (2)booleantrue, false1, 0 time13:20:00.000, 13:20:00.000-05:00参见 (2)dateTime1999-05-31T13:20:00.000-05:00这个时间表示的含义是:1999年5月31日美东标准时间下午1:20,注意后面的-05:00表示这个时间比格林尼治时间早5个小时。参见 (2)durationP1Y2M3DT10H30M12.3S这表示经过了1年2个月3天又10个小时30分钟12.3秒。date1999-05-31参见 (2)gMonth--05--表示5月。参见 (2) (5)gYear1999表示1999年。参见 (2) (5)gYearMonth1999-02表示1999年2月,而并不关心是几号。参见 (2) (5)gDay---31表示31号。参见 (2) (5)gMonthDay--05-31表示每个5月31号。参见 (2) (5)NameshipToXML 1.0的Name类型QNamepo:USAddressXML命名空间的QName类型NCNameUSAddressXML命名空间的NCName类型,即一个不带命名空间前缀修饰的QNameanyURIhttp://www.example.com/, http://www.example.com/doc.html#ID5 languageen-GB, en-US, frXML 1.0中定义的合法语言代码ID XML 1.0中定义的ID属性类型。参见 (1)IDREF XML 1.0中定义的IDREF属性类型。参见 (1)IDREFS XML 1.0中定义的IDREFS属性类型。参见 (1)ENTITY XML 1.0中定义的ENTITY属性类型。参见 (1)ENTITIES XML 1.0中定义的ENTITYS属性类型。参见 (1)NOTATION XML 1.0中定义的NOTATION属性类型。参见 (1)NMTOKENUS, BrésilXML 1.0中定义的NMTOKEN属性类型。参见 (1)NMTOKENSUS UK, Brésil Canada MexiqueXML 1.0中定义的NMTOKENS属性类型,即一个使用空格作为元素分隔的NMTOKEN列表。参见 (1)

注意:

  1. 为了在XML Schema和XML 1.0 DTD之间保持兼容,简单类型ID、IDREF、IDREFS、ENTITY、ENTITIES、NOTATION、NMTOKEN、NMTOKENS只能用在属性定义中;
  2. 这个类型的值能够表示为不止一种格式,如100和1.0E2都是有效的float格式,它们都表示”一百”这个数值。然而,对于这个类型而言,已经为其定义了规范的格式规则。
  3. 换行符、制表符和回车符在normalizedString中将会在处理前被转化成空格字符
  4. 作为normalizedString,相邻的空格字符将会被合并为一个空格字符,第一个和最后的空格将被移走
  5. “g”前缀表示罗马历的时间和年代。

新的简单类型通过从现有的简单类型(内置的简单类型以及源于内置简单类型的简单类型)引出定义。特别的,我们通过重新约束一个现存的简单类型来引出一个新的简单类型。换句话说,新类型的合法值范围是现有类型的值范围的子集。我们使用simpleType元素来定义和命名新的简单类型,我们使用restriction元素来指出现有的基类型。并且用它来标识约束值范围的细节。

假设我们希望建立一个新的整数类型称为myInteger,他的值范围为10000到99999。我们的定义应当基于简单类型integer,然后定义他的值范围为10000到99999。为了定义myInteger,我们这样来约束integer的范围(参见下图):

<!-- Schema Fragment --><xsd:simpleType name="zipUnion">  <xsd:union memberTypes="USState listOfMyIntType"/></xsd:simpleType><!-- Instance Fragment --><zips>CA</zips><zips>95630 95977 95945</zips><zips>AK</zips>

?

当我们在定义一个联合类型时,元素union的memberTypes属性的值包含了联合类型中所有类型的列表。现在,假定我们声明了一个zipUnion类型的元素,称为zips,zips元素有效的实例可参见上图。

此外,对于联合类型而言,还有两个描述性质的参数pattern和enumeration也可以应需要使用。

Copyrightc 2001?W3C,(?MIT,?INRIA,?Keio),All Rights Reserved.

?

热点排行