来自Rob Sheldon,2014/03/26(第一次出版:2012/09/20)
本系列
本文是楼梯系列的一部分:XML的解体
自从2003年以来,XML已经成为SQL标准的一部分。它也是必不可少的对于任何数据库管理员来说,因为许多动态管理视图需要返回XML数据,如今这个行业更习惯于用数据定义文档标记,它也正变得比以往更为重要对于数据库开发人员和数据库管理员们来说,去理解技术以及知道合理使用XML。在这个系列的文章中,Rob Sheldon通过使用他的才华使得这个复杂的东西变得简单。
注意:本系列文章可以作为一本电子书。
支持可扩展标记语言(XML)第一次介绍了SQL Server与Server 2000的释放。然而,与XML相关的功能仅限于数据管理功能,专注于关系数据和XML数据映射。例如SQL Server 2000添加了XML条款,它可以让你返回关系查询结果为XML。
然而,它没有被实现直到SQL Server2005,数据类型被加入—支持XML变得有趣。本机数据类型允许您在列中存储XML文档类型和变量配置。数据类型也支持一种方法可以用来检索和修改XML文档中的特定组件。
为了充分利用XML相关的特性SQL Server,您可能会发现它是有用的如果事先对XML有一个基本的了解。为此,本系列第一阶梯XML说明了什么事XML,并且描述了各个组件是如何组成一个XML文档。
XML的概述
与超文本标记语言(HTML)相似,XML是一种标记语言,使用标签来描述,描述这些与标签相关的数据的性质。XML可扩展它的自描述的性质,也就是说,你创建标记特定于XML文档中的包含的数据值,在HTML中,这些标签是预定义的。(XML的可扩展性将变得更加清楚当我们通过XML组件工作的时候)
尽管它拥有可扩展性,XML仍然是一个标准化的语言,必须符合一组特定的格式规则,根据万维网联盟(W3C)的定义。正是因为这种标准化,本语言已经被广泛用来传输和存储数据,不像HTML,仅用于显示数据。XML可以轻松地在异构系统之间共享数据,无论硬件、操作系统或应用程序类型,XML的通用性意味着数据可以很少的被人工干预。 同时,你也可以控制如何描述数据,同时控制如何命令和显示数据。
XML的组件
XML的主要组件组成了一个XML文档,并管理这些组件的使用。通常,规则很简单,但是你必须严格遵守这些规则以便XML文档能够妥善处理SQL Server的XML解析器。
主要有两种类型的信息包含在一个XML文档:数据存储和描述数据标签。 标签是由一组尖括号(< >),附上一个描述性的词或复合词(没有空格),描述了与标记相关的数据。 这是因为这些标记的自描述特性的XML通常被认为是一个元语言。
每个离散块存储数据封装在一个开始标记和结束标记,如以下示例所示:
<Person>John Doe</Person>
在这种情况下,开始标记<person>,关闭标签></person。 注意,一个斜杠之前结束标记标签描述。 斜杠必须先于所有结束标签,但是标签的语言必须一样的开始标记,在上面的示例人。 除了我可以选择一个名称person,其中一个名字与人无关,但是一个良好的实践是总是最好提供标记名称,描述数据封装在打开和关闭标签。 在这种情况下,标签是描述一个人的名字,John Doe,因此,标签的名字<person>。
在一起,标记和封闭数据代表的是单一的元素。 然而,不总是包含一个元素的数据。 一个空的元素可以以两种方式呈现。 首先是通过指定打开和关闭标签,但是没有包括数据,和我一样在以下例子:
<Person></Person>
另一种方式来表示一个空元素是仅使用一组括号,但还包括斜杠:
<Person />
再一次,可以使用这个方法只有当一个元素不包含值。 正如您稍后将会看到楼梯的XML系列,模式可能需要一个元素没有价值。 在这种情况下,您可以使用缩写形式来表示元素的两个标签。
一个元素是否包含一个值,只要这两个标签,打开和关闭标签必须完全匹配,到资本化(除了斜杠结束标记)。 例如,下列元素生成一个错误在SQL服务器的XML解析器,因为两个标记之间的情况是不同的:
<person>John Doe</Person>
描述性的词开始标记中的所有小写; 然而,关闭标签的描述性的词从一个大写字母开始。 打开和关闭标签必须匹配被认为是适当的,或格式良好的XML。
然而,你可以嵌入元素在每个其他。 在下面的例子中,我嵌入的两个实例<person>内的元素<person>元素:
<People> <Person>John Doe</Person> <Person>Jane Doe</Person> </People>
请注意,每个<person>元素本身就是完整的。 它包括打开和关闭标签和他们附上的数据。 被称为元素嵌入到其他元素孩子元素,或者在某些情况下,子元素。 外层的元素,在这种情况下,<person>,是父元素。 父元素的XML文档被认为是最高水平的根元素。 所有XML文档必须有一个且只有一个根元素。 因此<person>元素的父元素是在上面的例子中<person>元素,它是XML文档的根元素。
SQL Server允许您存储XML片段在一个XML列或变量。 一个片段是一个没有根元素的XML代码块,如以下示例所示的两个元素:
<Person>John Doe</Person> <Place>Seattle, WA</Place>
元素必须是格式良好的XML,也就是说,有附上数据匹配的标签,但是他们没有一个XML文档。 正如您稍后将会看到楼梯的XML系列,您可以指定只被允许在一个XML文档XML列或变量,但是现在只知道SQL Server区分和片断,可以存储的XML文档。
嵌入在其他元素时,你必须确保孩子结束之前完成父元素的元素。 例如,在下面的例子中,我结束了<person>元素之前<person>元素,它导致SQL Server XML解析器生成一个错误:
<People><Person>John Doe</People></Person>
你必须确保你的孩子元素包含嵌入元素完全不管有多少水平。 在下面这个例子<FirstName>和<LsatName>每个元素嵌入<person>元素,<person>元素嵌入到<person>元素:
<People> <Person> <FirstName>John</FirstName> <LastName>Doe</LastName> </Person> <Person> <FirstName>Jane</FirstName> <LastName>Doe</LastName> </Person> </People>
在这种情况下,<person>作为儿童和父母的元素。 不过,请注意,每个内嵌元素,不管水平,下降完全打开和关闭标签内的父元素。 例如,第一个的实例<FirstName>和<LastName>在第一个实例的元素完全下降<person>元素,和两个实例<person>元素内完全下降<person>元素,它是文档的根元素。
元素也可以拥有属性。 属性是一个属性,你可以指定一个值。 属性被定义为元素的开始标记的一部分。 在下面的例子中,我已经添加了id属性的每个实例<person>元素:
<People> <Person id="1234"> <FirstName>John</FirstName> <LastName>Doe</LastName> </Person> <Person id="5678"> <FirstName>Jane</FirstName> <LastName>Doe</LastName> </Person> </People>
案例展示了,一个属性由属性名(在本例中,id),其次是一个等号和属性值,包含在双引号。 因此,id第一个实例的属性<person>元素有一个值1234年,id第二个实例的属性<person>元素有一个值5678年。
是另一个组件中包含许多XML文档声明,这至少指定版本的XML文档符合标准。 到目前为止,只有两个版本:1.0和1.1。 如果使用XML 1.0,宣言没有必要; 然而,XML 1.1要求。 出于这个原因,你应该知道如何在XML文档包含一个声明。
如果你包含一个声明,你必须把它在文档的开始,开始的宣言< ?开始标记和结束它? >关闭标签。 此外,您必须包括XML关键字(小写)版本属性(小写)。 另一个属性一般包括在内,虽然可选的,是编码,它指定用于XML文档的字符编码。 在下面的例子中,我1.0版本包括一个声明,指定一个utf - 8编码,这意味着数据存储为一个8位Unicode字符序列:
<?xml version="1.0" encoding="UTF-8"?> <People> <Person id="1234"> <FirstName>John</FirstName> <LastName>Doe</LastName> </Person> <Person id="5678"> <FirstName>Jane</FirstName> <LastName>Doe</LastName> </Person> </People>
您还可以添加评论你的XML文档。 这样做,只是之前的评论<!- - - - - -- - - - - -标签和结束它- - >标签,我做了下面的例子:
<?xml version="1.0" encoding="UTF-8"?> <!-- A list of current clients --> <People> <Person id="1234"> <FirstName>John</FirstName> <LastName>Doe</LastName> </Person> <Person id="5678"> <FirstName>Jane</FirstName> <LastName>Doe</LastName> </Person> </People>
正如您可以看到的,我已经添加了评论一个当前的客户列表,我封闭在评论标签。 内的SQL Server XML解析器将忽略任何标签,所以你可以使用评论功能不仅提供XML文档的信息和数据,但还保留部分XML代码,你想挂在但你不想处理文档的一部分。
使用XML的另一个需要注意的是,某些字符不能被解析时出现在元素值。 例如,您不能在一个元素包含一个与字符(&)的价值,正如我做的<FavoriteBook>子元素下面的例子:
<?xml version="1.0" encoding="UTF-8"?> <!-- A list of current clients --> <People> <Person id="1234"> <FirstName>John</FirstName> <LastName>Doe</LastName> </Person> <Person id="5678"> <FirstName>Jane</FirstName> <LastName>Doe</LastName> <FavoriteBook>Crime & Punishment</FavoriteBook> </Person> </People>
如果我试着将这个XML文档分配给一个XML列或变量子元素将使解析器生成一个错误,因为价值包括&。 你必须将这种类型的字符替换成一个实体引用告诉解析器保持最初的性格。 一个实体引用始于一个&之间以分号结束,包括一个多字代码代表了原始值。 对于一个&,实体引用;,我用下面的例子:
<?xml version="1.0" encoding="UTF-8"?> <!-- A list of current clients --> <People> <Person id="1234"> <FirstName>John</FirstName> <LastName>Doe</LastName> </Person> <Person id="5678"> <FirstName>Jane</FirstName> <LastName>Doe</LastName> <FavoriteBook>Crime & Punishment</FavoriteBook> </Person> </People>
请注意,我的&所取代&实体引用。 现在,XML解析器将处理<FavoriteBook>元素没有问题。 但注意&不是唯一的角色,将生成一个错误。 XML标准标识应该替换为5个字符实体引用,就像我在上面的例子中:
- 小于(<):替换为& lt;
- 更大的比(>):替换为一些损伤t;
- &(&):替换为&
- 撇号(”):替换为&7月;
- 引号(”):替换为&”;
的例子提出的另一个问题是,子元素从一个父母不必是相同的实例。 正如您可以看到的,第一个实例<person>元素只包含<FirstName>和<LastName>的子元素,但第二个实例元素<person>包含了<FirstName>和<LastName>子元素,以及<FavoriteBook>元素。 只要你的子元素是完整的,你可以包括任何必要的描述和定义数据元素。
总结
在这个层面上,我们看了看主要组件组成一个XML文档。 元素作为所有XML文档的基本构建块,与每个元素被划定一个开始标记和结束标记之间的数据值本身是封闭的这两个标记。 元素可以相互嵌入,但一个元素—root-must作为父在XML文档中所有其他元素。 一个元素还可以包含属性,定义为元素的开始标记的一部分。
那样方便可能是知道如何组建一个XML文档,这个级别的目的没有训练你如何创建这些类型的文档,而是提供一个介绍XML,这样你就可以更有效地处理XML在SQL Server。 在接下来的层面上,我们来看看如何XML数据类型是在SQL Server中实现,以及它如何可以分配给列和变量来存储这两个XML文档和XML片段。