1. 程式人生 > >階梯XML:一級-介紹XML

階梯XML:一級-介紹XML

指定版本 導致 rst 展示 共享 做的 數據庫 操作系統 同時

來自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 &amp; Punishment</FavoriteBook>
</Person>
</People>
 

請註意,我的&所取代&amp;實體引用。 現在,XML解析器將處理<FavoriteBook>元素沒有問題。 但註意&不是唯一的角色,將生成一個錯誤。 XML標準標識應該替換為5個字符實體引用,就像我在上面的例子中:

  • 小於(<):替換為& lt;
  • 更大的比(>):替換為一些損傷t;
  • &(&):替換為&amp;
  • 撇號():替換為&7月;
  • 引號():替換為&;

的例子提出的另一個問題是,子元素從一個父母不必是相同的實例。 正如您可以看到的,第一個實例<person>元素只包含<FirstName>和<LastName>的子元素,但第二個實例元素<person>包含了<FirstName>和<LastName>子元素,以及<FavoriteBook>元素。 只要你的子元素是完整的,你可以包括任何必要的描述和定義數據元素。

總結

在這個層面上,我們看了看主要組件組成一個XML文檔。 元素作為所有XML文檔的基本構建塊,與每個元素被劃定一個開始標記和結束標記之間的數據值本身是封閉的這兩個標記。 元素可以相互嵌入,但一個元素—root-must作為父在XML文檔中所有其他元素。 一個元素還可以包含屬性,定義為元素的開始標記的一部分。

那樣方便可能是知道如何組建一個XML文檔,這個級別的目的沒有訓練你如何創建這些類型的文檔,而是提供一個介紹XML,這樣你就可以更有效地處理XML在SQL Server。 在接下來的層面上,我們來看看如何XML數據類型是在SQL Server中實現,以及它如何可以分配給列和變量來存儲這兩個XML文檔和XML片段。

階梯XML:一級-介紹XML