SQL Server 2008中有关XML的新功能(3)
作者:戴羽 来源:IT专家网 发布时间:2008-06-04 12:57:00
3 增强了XML Schema验证功能
你可以使用一个或多个XSD schema执行遵从性检查,以此来验证XML数据。一个schema为某个特定的XML数据结构定义被允许的XML元素和属性,并通常用于确保XML文档按正确的结构包含进了所要求的所有数据元素。
SQL Server 2005推出了通过使用XML schema 集合来进行XML数据验证。一般的方法是使用CREATE XML SCHEMA COLLECTION语句创建包含了针对你的XML数据的schema 规则的schema集合,然后当你要定义一个必须符合这个schema 集合中的schema 规则的xml字段或变量时参照这个schema集合名称。然后SQL Server会按照这个schema集合中的schema规则来验证插入或更新进这个字段或变量的所有数据。
在SQL Server 2005中的XML Schema支持实现了一个广泛的纯XML Schema规格的子集,并涵盖了最常见的XML验证场景。SQL Server 2008扩展了这个支持,使得它包含下面新增加的由客户确定的schema 验证要求:
· 对lax 验证的支持
· 对dateTime、time和date 验证的完全支持,包括时区信息的保存。
· 改进了对union和list类型的支持
3.1 支持Lax验证
XML Schema通过使用any、anyAttribute和anyType声明来支持XML文档中的通配符。例如,看看下面的XML schema 声明:
<xs:complexType name="Order" mixed="true">
<xs:sequence>
<xs:element name="CustomerName"/>
<xs:element name="OrderTotal"/>
<xs:any namespace="##other" processContents="skip"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
这个schema 声明定义了一个叫做Order 的XML元素,它必须包含叫做CustomerName和OrderTotal的子元素。此外,这个元素可以包含Order类型所属的命名空间之外的其它命名空间的无限制数目的其它元素。下面的XML显示了一个包含由这个schema 声明所定义的Order 元素的一个实例的XML文档。注意这个order 还包含了一个shp:Delivery 元素,它没有在schema中明确定义。
<Invoice xmlns="http://adventure-works.com/order"
xmlns:shp="http://adventure-works.com/shipping">
<Order>
<CustomerName>Graeme Malcolm</CustomerName>
<OrderTotal>299.99</OrderTotal>
<shp:Delivery>Express</shp:Delivery>
</Order>
</Invoice>
对通配符的验证取决于在schema定义中的通配符的processContents 属性。在SQL Server 2005中,schema可以使用用于any和anyAttribute声明的skip和strict 的processContents值。在前面的示例中,这个通配符元素的processContents属性被设置为skip,所以不会对这个元素的内容进行验证。即使这个schema集合包含一个对shp:Delivery元素的声明(例如,定义一组有效的发送方法对Order元素中的通配符),这个元素也不会被验证,除非在Order元素中对通配符的声明将它的processContents属性设置为strict。
SQL Server 2008增加了对第三方验证的支持。通过将一个通配符的processContents属性设置为lax ,你可以对具有相应的schema 声明的任何元素进行验证,但忽略没有在schema 中定义的所有元素。继续前面的示例,如果你将schema中对通配符元素的声明中的processContents属性设置为lax 并增加一个对shp:Delivery元素的声明,那么在XML文档中的shp:Delivery 元素会被进行验证。然而,如果不是shp:Delivery 元素,而是该文档包含了一个没有在schema中声明的元素,那么这个元素会被忽略掉。
此外,XML Schema 规格定义anyType声明具有对它的内容模型的lax处理方式。SQL Server 2005不支持lax处理,所以会严格的对内容进行验证。SQL Server 2008支持anyType 内容的lax处理,因此内容会被正确的进行验证。
3.2 对 xs:dateTime 的完全支持
你可以在一个XML schema 中使用dateTime数据类型来定义日期和时间数据。日期和时间数据以2007-08-01T09:30:00:000Z的格式来显示,这表示的是通用协调时(UTC)2007年8月1日早上9:30,这用Z表示。其它的时区显示的时间与通用协调时间不同,因此例如你能使用太平洋标准时间2007-12-25T06:00:00:000-8:00来显示2007年12月25日的早上6:00(它比UTC时间滞后8小时)。
XML Schema 规格定义了可选择的dateTime、date和time 数据类型的时区组件。然而,在SQL Server 2005中你必须提供一个用于dateTime、date和time数据的时区。此外,SQL Server 2005不保存你的dateTime或time数据的时区信息,但是会将它规格化为UTC时间(所以例如,如果你的XML有个2007-12-25T06:00:00:000-8:00的值,SQL Server 2005会将它规格化为2007-12-25T14:00:00:000Z。)在SQL Server 2008中没有这些限制,所以当你存储dateTime、date或time数据时你可以省略时区信息,并且你提供的任何时区信息都会被保存下来。
3.3 Union和List类型
你可以使用XML schema 将你的XML数据的数据类型定义为允许将一个有限集合的值赋给具有多个值的元素和属性。例如,你可能定义一个sizeListType类型,它使产品定义中的一个AvaliableSizes元素的赋值限制为S、M和L。SQL Server 2005支持XML schema包含这些简单的类型定义和限制。例如,你可以使用一个list类型来定义一个产品的有效的型号,如下面的示例所示:
<xs:simpleType name="sizeListType">
<xs:list>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="S"/>
<xs:enumeration value="M"/>
<xs:enumeration value="L"/>
</xs:restriction>
</xs:simpleType>
</xs:list>
</xs:simpleType>
这个schema 声明使你可以创建一个列出所有型号的元素,其中产品可以按照被空格分开的一组值来购买,如下面的示例所示:
<AvailableSizes>S M L</AvailableSizes>
然而,如果你想支持两种不同的方式来表达一个产品的型号呢?例如,假设一个自行车产品零售商卖具有大、中、小型号的骑自行车穿的衣服,但是还想按照衣服尺寸来卖(例如18、20、22和24)?为了使你能够这样做,SQL Server 2008增加了对包含list类型的union类型的支持,你可以使用它将多个类型定义和限制合并到一个单独的类型中去。例如,下面的Transact-SQL代码创建了一个XML schema集合,它定义了一个productSizeType类型,其中有效值包括一组数字型号(18、20、22和24)和一组名称型号(S、M和L)。
CREATE XML SCHEMA COLLECTION CatalogSizeSchema AS N'<?xml version="1.0" encoding="UTF-16"?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:simpleType name="productSizeType"> <xs:union> <xs:simpleType> <xs:list> <xs:simpleType> <xs:restriction base="xs:integer"> <xs:enumeration value="18"/> <xs:enumeration value="20"/> <xs:enumeration value="22"/> <xs:enumeration value="24"/> </xs:restriction> </xs:simpleType> </xs:list> </xs:simpleType> <xs:simpleType> <xs:list> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="S"/> <xs:enumeration value="M"/> <xs:enumeration value="L"/> </xs:restriction> </xs:simpleType> </xs:list> </xs:simpleType> </xs:union> </xs:simpleType></xs:schema>'
有了schema中的这个声明,任何基于productSizeType 的元素都可以包含任何种类的列表;所以下面示例中的两种产品元素都是productSizeType数据类型的有效的实例。
<Catalog>
<Product>
<ProductName>Road Bike</ProductName>
<AvailableSizes>22 24</AvailableSizes>
</Product>
<Product>
<ProductName>Cycling Jersey</ProductName>
<AvailableSizes>S M L</AvailableSizes>
</Product>
</Catalog>
类似的,SQL Server 2008支持对包含union 类型的list 类型的schema 声明。


猜你喜欢
- 我们从一个测试开始。下面这个函数的功能是什么? def foo(lst): a = 0 for i in
- mysql优化表释放表空间方法一:optimize table table_name这是我们经常见到的方法,这里就不在过多介绍。方法二:al
- 关于一些代码里的解释,可以看我上一篇发布的文章,里面有很详细的介绍!!!可以依次把下面的代码段合在一起运行,也可以通过jupyter not
- 反向传递法则是深度学习中最为重要的一部分,torch中的backward可以对计算图中的梯度进行计算和累积这里通过一段程序来演示基本的bac
- 前言这篇文章主要是就在公司实习的时候,对SQL优化工作作出的一些整理。在公司实习的时候,导师分配了SQL慢查询优化的任务,任务是这样的:每周
- 数字滤波分为 IIR 滤波,和FIR 滤波。FIR 滤波:import scipy.signal as signalimport numpy
- 虚拟环境管理今天聊聊Python中虚拟环境的价值和常用命令。为什么会有虚拟环境?在实际项目开发中,我们通常会根据自己的需求去下载各种相应的框
- 前言对于数据库中的树形结构数据,如部门表,有时候,我们需要知道某部门的所有下属部分或者某部分的所有上级部门,这时候就需要用到mysql的递归
- 本文实例讲述了python的keyword模块用法。分享给大家供大家参考。具体如下:Help on module keyword:NAME
- 学习前言已经完成了RNN网络的构建,但是我们对于RNN网络还有许多疑问,特别是tf.nn.dynamic_rnn函数,其具体的应用方式我们并
- 0.摘要我们将一个list传入函数后,函数内部对实参修改后,形参也会随之改变。本文将主要介绍这种错误的现象、原因和解决方法。1.代码示例de
- 淘宝的页面很复杂,如果使用分析ajax或者js的方式,很麻烦抓取淘宝‘美食'上面的所有食品信息spider.py#encoding:
- 前言 好长时间没摸数据库了,周末在家写了个报表的存储过程,一时间对使用存储过程实
- 本文实例为大家分享了python实现飞机大战的具体代码,供大家参考,具体内容如下初学Python,写了一个简单的Python小游戏。师出bi
- 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过
- 1.写在前面JS要实现下载功能,一般都是这么几个过程:生成下载的URL,动态创建一个A标签,并将其href指向生成的URL,然后触发A标签的
- 本文实例讲述了ES6新特性中的let和const命令。分享给大家供大家参考,具体如下:1. let 命令① 在js中是没有块级作用域的,va
- 安装数据可视化模块matplotlib:pip install matplotlib导入matplotlib模块下的pyplot1 折线图f
- 今天我们来到了循环队列这一节,之前的文章中,我介绍过了用python自带的列表来实现队列,这是最简单的实现方法。但是,我们都知道,在列表中删
- 如下所示:import numpy as npfrom torchvision.transforms import Compose, ToT