XML的阶梯:一级——XML的介绍
作者:Rob Sheldon(first published: 2012/09/20)
本系列文章是楼梯系列:楼梯到XML
XML从2003年就成为了SQL标准的一部分,也是许多DBA必不可缺的一部分,因为很多的动态管理师徒返回XML数据。现代的行业更多用来定义数据的文档标记,这比以往让数据库开发人员和数据库应用系统去理解该技术和知道怎么有效的利用XML更重要。本系列的文章,Robert Sheldon展示了他的才华把复杂的问题简单化。注:本系列的文章现在可以作为一本电子书。
随着SQL Server 2000的发布,可扩展标记语言支持第一次在SQL Server中被介绍。但是,X,ML的相关数据在致力于映射XML的数据间的关系的数据管理容量中是有限的。例如,SQL Server 2000增加了让关系查询结果展示位为XML的 FOR XML子句。
然而,直到SQL Sever 2005的发布,XML的数据类型才被添加进去,这支持了XML使之变得有趣。XML数据类型允许您将XML文档存储在具有该类型定义的列和变量中。这种数据类型也支持一套方法供你检索和修改特定组件,包括XML文档。
获得在SQL Server 中,XML相关数据的所有优点,你会发现这有助于对XML有个基本的了解。最后,这是XML系列的第一个阶梯解释了什么是XML和描述了组成XML文档的各种组件。
XMl的概述
与HTML类似,XML是一种标记语言,它使用标签来形容和描述与这些标签相关的数据的性质,使XML可扩展的是它的自描述性质,也就是说,在XML中创建特定的包含数据值的标签。在HTML中,那些标签是预定义的。(当我们通过XML组件工作时,XML的可扩展特性将变得更加清晰。)
尽管其可扩展性,XML仍然是一种标准化的语言,必须符合由万维网联盟(W3C)定义的一组特定格式规则,由于这种标准化,这种语言被广泛采用用来传输和存储数据,不像HTML那样用来显示数据。XML使得在异构系统中轻松地共享数据成为可能,而不管硬件、操作系统或应用程序类型,XML的普遍采用意味着数据可以通过很少的人工干预来处理。与此同时,你可以控制如何描述数据,同时控制数据的顺序和显示方式。
XML组件
构成XML文档的主要组件和支配这些组件使用的规则通常非常简单,但为了使XML文档能够正确处理,必须严格遵守这些规则。
XML文档中主要包含两种类型的信息:要存储的数据和描述数据的标记。标签由一组尖括号描述标签或与标记相关联的数据的描述性词或复合词(无空格)组成。正是由于这些标签的自描述性质,XML通常被认为是元语言。
每个离散数据存储在一个打开标记和一个结束标记中,如下面的例子所示:
<Person>John Doe</Person>
在这个例子中,打开标签是<Person>,关闭标签是</Person>。注意,前斜杠在标签后面的标记描述之前。前斜杠必须位于所有结束标记之前,但标签的语言必须与打开标记相同,在上面的示例中是Person。我可以选择一个名字,而不是Person,包括一个与人无关的名字,但一个好的做法是总是提供标记名称,最好描述在打开和关闭标签中包含的数据。在这种情况下,标签是描述一个人的名字,某个身份不明的人,因此标签名<Person>。
同时,标记和封闭的数据代表一个元素。但是,元素并不总是必须包含数据。一个空元素可以以两种方式之一呈现。第一种方法是指定打开和关闭标记,但不包含数据,如下面的示例中所示:
<Person></Person>
表示空元素的另一种方法是只使用一组括号,但仍然包含前斜杠
<Person />
同样,只有当元素不包含值时,才可以使用此方法。正如您稍后在通往XML的阶梯中看到的,一个模式可能需要一个没有值的元素。在这种情况下,可以使用缩短的格式来表示元素的两个标记。
无论一个元素是否包含一个值,当使用这两个标记时,打开和关闭标记必须完全匹配,直到大写(除了结束标记中的前斜杠)。例如,下面的元素在SQL Server解析器中生成一个错误,因为两个标记之间的情况不同:
<person>John Doe</Person>
打开标记中的描述性单词都是小写的;但是,结束标记中的描述性单词以大写字母开头。打开和关闭标记必须匹配为合适的或格式良好的XML。
不过,您可以将元素嵌入彼此之间。在下面的示例中,我将<Person>中的两个实例嵌入到< Person >:
<People>
<Person>John Doe</Person>
<Person>Jane Doe</Person>
</People>
注意每个< Person >元素本身是完整的。它包括打开和关闭标签和它们所附的数据。嵌入在其他元素的元素称为子元素,或者,在某些情况下,子元素。在这种情况下,外部元素< Person >是父元素。XML文档最高级别的父元素被认为是根元素。所有的XML文档必须有一个且只有一个根元素。因此,上面例子中的<元素>是两个元素的父元素,它是XML文档的根元素。
SQL Server还允许您将XML片段存储在XML列或变量中。片段是一段没有根元素的XML代码,如以下示例所示的两个元素:
<Person>John Doe</Person>
<Place>Seattle, WA</Place>
元素必须仍然是格式良好的XML,也就是说,有包含数据的匹配标记,但它们不一定是XML文档。正如您稍后在XML系列的阶梯中看到的,您可以指定在XML列或变量中只允许XML文档,但现在只知道SQL Server区分XML文档和片段,可以存储两者。
在其他元素中嵌入元素时,必须确保在结束父元素之前完成子元素。例如,在下面的示例中,我在< >元素>之前结束< >元素>,这将导致SQL Server解析器产生错误:
<People><Person>John Doe</People></Person>
无论多个级别包含嵌入元素,都必须确保子元素是完整的。在下面这个例子里,< FirstName >和< LastName >元件嵌入在每个<人>和< Person >元素,元素嵌入在< Perso
</Person>
<Person>
<FirstName>Jane</FirstName>
<LastName>Doe</LastName>
</Person>
</People>
在这种情况下,< Person >充当子元素和父元素。但是请注意,每个嵌入的元素,不管级别如何,完全属于父元素的打开和关闭标记。例如,< FirstName >和< LastName >元素的第一个实例的<人>完全属于元素的第一个实例中,和两个实例< 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属性的值为1234,而第二个实例的id属性的值为5678。
许多XML文档中包含的另一个组件是声明,它至少指定了文档所遵循的XML标准的版本。到目前为止,只有两个版本:1.0和1.1。如果使用XML 1.0,则不需要声明;但是,XML 1.1需要一个。出于这个原因,您应该知道如何在XML文档中包含声明。
如果您包含一个声明,那么您必须将它放在文档的开头,并使用小于的声明开始声明?打开标签,然后用它结束?>关闭标签。此外,还必须包括xml关键字(小写)和版本属性(也包括小写)。通常包含的另一个属性,尽管是可选的,是编码,它指定了用于XML文档的字符编码。在下面的例子中,我包含了一个声明,它指定了版本1.0和一个编码的8-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时另一个考虑因素是,当元素值出现时,不能解析某些字符。例如,您不能在元素的值中包含一个&(&),就像我在下面的例子中所做的:子元素:
<? 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>
请注意,我已经替换了ampersand和& amp;实体引用。现在,XML解析器将处理< FavoriteBook >元素,没有问题。但是请注意,ampersand并不是唯一会产生错误的字符。XML标准标识了应该用实体引用替换的五个字符,正如我在上面的例子中所做的:
小于(<):替换为& lt;
大于(>):替换为& gt;
&兼:替换为& amp;
撇号(‘):替换为& apos;
引号("):用"替换"
这个例子提出的另一个问题是,子元素不必与父实例中的子元素相同。如您所见,< Person >元素的第一个实例只包含< FirstName >和< LastName >子元素,但是< Person >元素的第二个实例包含< FirstName >和< LastName >子元素,以及< FavoriteBook >元素。只要您的子元素形成良好,您就可以包含描述和定义您的数据所需要的任何元素。
总结:
在这个级别,我们研究了组成XML文档的主要组件。元素作为所有XML文档的基本构建块,每个元素被打开的标签和结束标记描述,数据值本身被包含在这两个标记之间。元素可以彼此嵌入,但是一个元素—根必须充当XML文档中所有其他元素的父元素。元素还可以包含属性,这些属性被定义为元素的开始标记的一部分。
那样方便可能是知道如何组建一个XML文档,这个级别的目的没有训练你如何创建这些类型的文档,而是提供一个介绍XML,这样你就可以更有效地处理XML在SQL Server。在下一层中,我们将研究如何在SQL Server中实现XML数据类型,以及如何将其分配给列和变量,以便存储XML文档和XML片段。
这篇文章是通往XML楼梯的楼梯的一部分
注册到我们的RSS频道,一旦我们在楼梯上发布一个新的级别,就会得到通知