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

四全局元素和属性

全局的元素和全局的属性是在全局声明时被建立的,全局声明都是作为元素的子元素出现的。一旦经过定义,全局元素或者全局属性可以像先前我们描述的那样使用ref属性在一个或多个声明中引用。一个引用全局元素的声明,允许被引用的元素在实例文档中出现在引用这个元素的声明相关的元素中。所以,举例来说, po.xml中的comment元素同样可以在shipTo、billTo和items元素中出现,因为引用comment的复合类型定义的声明同样出现在这三个元素的声明中。

一个全局元素的声明也允许元素在实例文档中以顶级的文档元素出现,因此purchaseOrder元素,在po.xsd中是作为一个全局元素声明的,能够作为po.xml.中的顶级元素出现。值得注意的是,基于这个基本原理, comment元素作为顶级元素出现在文档如po.xml中也是被允许的。

关于使用全局的元素和属性有很多忠告,其中一个忠告是全局的声明不能够包含引用。全局的声明定义不能包含ref 属性,他们必须使用type 属性(或者,像我们简短描述的,跟随一个匿名的类型的定义)。第二个忠告是约束不能够放在全局声明中。尽管他们能够放在引用全局声明的局部声明中。换句话说,全局声明不能够包含minOccurs、maxOccurs、或者use属性。

 

 

五命名冲突

我们现在已经讨论了如何定义新的复合类型(比如PurchaseOrderType),声明元素(比如purchaseOrder)和声明属性(如orderDate)。这些行为一般都包含着命名,因此,问题自然就出现了:如果我们给两个对象赋予同样的名称会如何?答案取决于问题中的两个对象,尽管,一般来说两个对象越相近,他们越有可能引起冲突。

这里有一些例子来说明什么时候同样的名称会导致问题的出现。如果两个对象都是类型,如果我们去定义了一个复合类型称为USStates,同时又定义了一个简单类型称为USStates,此时就出现了冲突。如果两个对象是类型和元素或者是类型或者属性,当我们定义了一个复合类型叫USAddress,同时我们又定义了一个元素称为USAddress,此时是没有冲突发生的。如果两个对象是不同类型的元素(一般的,并非是全局元素),当我们声明了一个元素名字作为USAddress类型的一部分并且第二个元素名字作为item类型的一部分,此时就没有冲突(类似的元素有时候称为局部元素声明)。最后,如果两个对象都是类型,你自己定义了其中的一个,而XML Schema规范内置定义了另外的一个,比如你自己定义了一个简单类型称为decimal,那么此时没有冲突发生。最后一个例子中之所以没有命名冲突发生的原因是,因为他们属于不同的命名空间,我们将在后讨论在XML Schema中的XML命名空间的使用。

 

六简单类型

在购买订单模式文档中,几个元素和属性被声明为简单类型,其中一些简单类型如 string 和decimal是XML Schema中内置的。而其他的一些则是源于(如果使用对象技术的语言,就是继承)内置的类型。举例来说,partNum属性的类型称为SKU(Stock Keeping Unit),是源于string.的。内置的简单类型和他们的后继版本都能够被用在所有的元素和属性声明中,下面的列表列举了所有的在XML Schema中内置的简单类型及其相应的例子。

简单类型  值示例  备注 
string Confirm this is electric  
normalizedString Confirm this is electric 参见 (3)
token Confirm this is electric 参见 (4)
byte -1, 126 参见 (2)
unsignedByte 0, 126 参见 (2)
base64Binary GpM7  
hexBinary 0FB7  
integer -126789, -1, 0, 1, 126789 参见 (2)
positiveInteger 1, 126789 参见 (2)
negativeInteger -126789, -1 参见 (2)
nonNegativeInteger 0, 1, 126789 参见 (2)
nonPositiveInteger -126789, -1, 0 参见 (2)
int -1, 126789675 参见 (2)
unsignedInt 0, 1267896754 参见 (2)
long -1, 12678967543233 参见 (2)
unsignedLong 0, 12678967543233 参见 (2)
short -1, 12678 参见 (2)
unsignedShort 0, 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)
boolean true, false1, 0  
time 13:20:00.000, 13:20:00.000-05:00 参见 (2)
dateTime 1999-05-31T13:20:00.000-05:00 这个时间表示的含义是:1999年5月31日美东标准时间下午1:20,注意后面的-05:00表示这个时间比格林尼治时间早5个小时。参见 (2)
duration P1Y2M3DT10H30M12.3S 这表示经过了1年2个月3天又10个小时30分钟12.3秒。
date 1999-05-31 参见 (2)
gMonth --05-- 表示5月。参见 (2) (5)
gYear 1999 表示1999年。参见 (2) (5)
gYearMonth 1999-02 表示1999年2月,而并不关心是几号。参见 (2) (5)
gDay ---31 表示31号。参见 (2) (5)
gMonthDay --05-31 表示每个5月31号。参见 (2) (5)
Name shipTo XML 1.0的Name类型
QName po:USAddress XML命名空间的QName类型
NCName USAddress XML命名空间的NCName类型,即一个不带命名空间前缀修饰的QName
anyURI http://www.example.com/, http://www.example.com/doc.html#ID5  
language en-GB, en-US, fr XML 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)
NMTOKEN US, Brésil XML 1.0中定义的NMTOKEN属性类型。参见 (1)
NMTOKENS US UK, Brésil Canada Mexique XML 1.0中定义的NMTOKENS属性类型,即一个使用空格作为元素分隔的NMTOKEN列表。参见 (1)
注意:

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

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

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


使用基类型来定义新的简单类型

<xsd:simpleType name="myInteger">
  <xsd:restriction base="xsd:integer">
    <xsd:minInclusive value="10000"/>
    <xsd:maxInclusive value="99999"/>
  </xsd:restriction>
</xsd:simpleType>
 


上面的例子显示了一个由一个基本类型定义和两个值域区间方面描述的组合,通过这三个要素来对myInteger实施了定义。

而先前的购买订单模式文档则包含了其他的更详细的定义简单类型的例子。一个叫SKU的新简单类型(参见下图)是从(通过约束)简单类型string引出的。此外,我们使用一个称为pattern的描述以及pattern的正则表达式值"/d{3}-[A-Z]{2}"来约束SKU的值。其中,该正则表达式值的语义为:3个数字后面跟着一个连字号接着跟着两个大写的英文字母"。


<xsd:simpleType name="SKU">
  <xsd:restriction base="xsd:string">
    <xsd:pattern value="/d{3}-[A-Z]{2}"/>
  </xsd:restriction>
</xsd:simpleType>
 


XML Schema定义了15用于简单类型定义描述的词汇。在这些词汇中,enumeration是特别有用的,他能够被用于约束除boolean类型之外的几乎每一个简单类型。enumeration限制简单类型的值为一系列不同的枚举值。举例来说,我们可以使用enumeration来定义一个新类型称为USState(参见下图),USState是从string引出的,同时它的值必须为美国州的缩写。


<xsd:simpleType name="USState">
  <xsd:restriction base="xsd:string">
    <xsd:enumeration value="AK"/>
    <xsd:enumeration value="AL"/>
    <xsd:enumeration value="AR"/>
    <!-- and so on ... -->
  </xsd:restriction>
</xsd:simpleType>
 


USState将会在现在使用的state元素声明中成为string类型的一个非常好的替换品。通过使用这个替换品可以使state元素具有合法值的校验能力。举例来说,billTo和shipTo元素的子元素state,将会被限制在AK,AL,AR等等中。注意到对于特定类型的列举值必须是唯一的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值