阶梯到XML:1级 - XML简介
作者: Rob Sheldon,2014/03/26
原文鏈接:http://www.sqlservecentral.com/articles/stairway+series/introduction+to+XML/92780/
系列
? 這篇文章是階梯系列的一部分:階梯XML
? XML自2003年以來一直都是SQL標準的一部分,對于任何DBA也是至關重要的,因為許多動態(tài)管理視圖該行業(yè)更多地返回XML數(shù)據(jù)。現(xiàn)在,該行業(yè)更多地用于由文檔標記定義的數(shù)據(jù),數(shù)據(jù)庫開發(fā)人員和數(shù)據(jù)庫管理員比以往任何時候都更了解技術并了解使用XML的方式。在這一系列文章中,羅伯特。謝爾頓(Robert Sheldon)使復雜看似簡單。注意:這一系列的文章現(xiàn)在可以作為電子書。
? 可擴展標記語言(XML)的支持首先在SQL Server中引入了SQL Server 2000的發(fā)行版。但是,與XML相關的功能僅限于專注于映射關系數(shù)據(jù)和XML數(shù)據(jù)的數(shù)據(jù)管理功能。例如,SQL Server 2000添加了FOR XML子句,可以將關系查詢結果作為XML返回。
? 但是,直到SQL Server 2005添加了XML數(shù)據(jù)類型時,支持XML才有意義。XML數(shù)據(jù)類型允許您將XML文檔本身存儲在使用該類型配置的列和變量中。數(shù)據(jù)類型還支持一組可用于檢索和修改XML文檔中特定組建的方法。
? 要充分利用SQL Server支持的與XML相關的功能,您可能會發(fā)現(xiàn)對XML本身有一個基本的了解是有用的。為此,第一層樓梯XML系列解釋了XML是什么,并描述了構成XML文檔的各種組件。
? XML概述
? 類似于超文本標記語言(HTML),XML是一種標記語言,它使用標簽來描述和描述與這些標簽相關聯(lián)的數(shù)據(jù)的性質。什么使XML可擴展性是其自我描述性質,也就是創(chuàng)建特定于XML文檔中包含的數(shù)據(jù)值的標簽。在HTML中,這些標簽是預定義的。(通過XML組件,XML的可擴展性將變得更加清晰)
? 盡管其可擴展性,XML仍然是一種標準化語言,必須符合由萬維網聯(lián)盟(w3c)定義的特定格式規(guī)則集。由于這種標準化,與用于顯示數(shù)據(jù)的HTML不同,該語言被廣泛采用以便傳輸和存儲數(shù)據(jù)。XML可以輕松地在異構系統(tǒng)之間共享數(shù)據(jù),而不管硬件,操作系統(tǒng)或應用程序如何,而XML的普遍采用意味著數(shù)據(jù)可以很少的人為干預進行處理。同時,您可以控制數(shù)據(jù)的描述,同時還可以控制數(shù)據(jù)的排列和顯示方式。
XML組件
? 構成XML文檔的主要組件以及管理這些組件的使用的規(guī)則通常非常簡單,但是您 必須嚴格遵守這些規(guī)則,以便SQL Server XML解析器正確處理XML文檔。
? XML文檔中主要包含兩種類型的信息:要存儲的數(shù)據(jù)和描述數(shù)據(jù)的標簽。標簽由一組尖括號組成,它們包含描述與標簽相關聯(lián)的數(shù)據(jù)的描述性詞或復合詞。這是因為這些標簽的自我描述性質,XML通常被認為是元語言。
? 每個離散的存儲數(shù)據(jù)片段都封裝在開放標簽和結束標簽中,如下例所示:
? <Person>John Doe</Person>
? 在這種情況下,開始標簽是<Person>,結束標簽是</Person>。請注意,正斜杠位于結束標記中標記描述之前。正斜杠必須在所有結束標簽之前,但標簽的語言必須與開頭標簽相同,上面的示例是Person。我可以選擇一個除Person之外的名稱,包括與人無關開頭標簽相同,的名稱,但是一個很好的做法是始終提供最能描述打開和關閉標簽中包含的數(shù)據(jù)的標簽名稱。 在這種情況下,標簽描述了一個人的名字John Doe,因此標簽名稱為<Person>。
另外,標簽和封閉的數(shù)據(jù)代表一個單一的元素。 但是,元素并不總是包含數(shù)據(jù)。 一個空的元素可以以兩種方式之一呈現(xiàn)。 第一個是通過指定打開和關閉標簽,但不包括數(shù)據(jù),如下例所示:
<Person></Person>
表示一個空白元素的另一種方法是只使用一組括號,但仍包括正斜杠:
<Person />
再次,只有當元素不包含值時,才能使用此方法。 如稍后您將在樓梯到XML系列中看到的,模式可能需要一個沒有值的元素。 在這種情況下,您可以使用縮寫格式來表示元素的兩個標簽。
無論元素是否包含值,只要使用兩個標簽,開標和關閉標簽必須完全匹配,直到大小寫(除了結束標簽中的正斜杠)。 例如,以下元素在SQL Server XML解析器中生成錯誤,因為兩個標簽之間的情況不同:
<person>John Doe</Person>
開始標簽中的描述性字都是小寫的; 然而,結束標簽中的描述性詞以大寫字母開頭。 開始和結束標簽必須匹配,以被認為是適當?shù)?#xff0c;或者格式良好的XML。
但是,您可以將元素嵌入彼此。 在以下示例中,我將<Person>元素的兩個實例嵌入到<People>元素中:
<People>
<Person>John Doe</Person>
<Person>Jane Doe</Person>
</People>
請注意,每個<Person>元素本身都是完整的。 它包括打開和關閉標簽及其附帶的數(shù)據(jù)。 嵌入其他元素的元素稱為子元素,或在某些情況下稱為子元素。 外部元素(在這種情況下為<People>)是父元素。 XML文檔最高級別的父元素被認為是根元素。 所有XML文檔必須有一個,而且只有一個根元素。 因此,上面示例中的<People>元素是兩個<Person>元素的父元素,它是XML文檔的根元素。
SQL Server還允許您將XML片段存儲在XML列或變量中。 片段是沒有根元素的XML代碼塊,例如以下示例中顯示的兩個元素:
<Person>John Doe</Person>
<Place>Seattle, WA</Place>
元素必須仍然是格式良好的XML,也就是具有包含數(shù)據(jù)的匹配標簽,但它們不一定是XML文檔。 如稍后您將在樓梯的XML系列中看到的那樣,您可以指定只允許在XML列或變量中使用XML文檔,但現(xiàn)在只要知道SQL Server區(qū)分XML文檔和片段,并且可以存儲兩者。
在其他元素中嵌入元素時,必須確保子元素在完成父元素之前已經完成。 例如,在以下示例中,我在<Person>元素之前結束<People>元素,這會導致SQL Server XML解析器生成錯誤:
<People><Person>John Doe</People></Person>
???您必須確保您的子元素是完整的,無論多少級別包含嵌入元素。 在下面的示例中,<FirstName>和<LastName>元素嵌入在每個<Person>元素中,<Person>元素嵌入在<People>元素中:
?<People>
<Person>
<FirstName>John</FirstName>
<LastName>Doe</LastName>
</Person>
<Person>
<FirstName>Jane</FirstName>
<LastName>Doe</LastName>
</Person>
</People>
在這種情況下,<Person>元素充當子元素和父元素。 但是請注意,每個嵌入的元素,無論級別如何,完全落在父元素的開始和結束標記之內。 例如,<FirstName>和<LastName>元素的第一個實例完全落在<Person>元素的第一個實例中,并且<Person>元素的兩個實例完全落在<People>元素中,即 文檔的根元素。
????元素也可以具有與它們相關聯(lián)的屬性。 屬性是可以賦值的屬性。 該屬性被定義為元素的開始標簽的一部分。 在以下示例中,我已經將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),后跟等號,屬性值由雙引號括起來。 因此,<Person>元素的第一個實例的id屬性的值為1234,而<Person>元素的第二個實例的id屬性的值為5678。
許多XML文檔中包含的另一個組件是聲明,它至少指定了文檔符合的XML標準的版本。 到目前為止,只有兩個版本:1.0和1.1。 如果使用XML 1.0,聲明是不必要的; 然而,XML 1.1需要一個。 因此,您應該知道如何在XML文檔中包含聲明。
如果您包含聲明,則必須將其放在文檔的開頭,用<? 打開標簽,并使用?>關閉標簽結束。 另外,您必須包含xml關鍵字(小寫)和版本屬性(也是小寫)。 通常包括的另一個屬性(盡管是可選的)是編碼,它指定用于XML文檔的字符編碼。 在下面的示例中,我包括一個聲明,它指定版本1.0和UTF-8的編碼,這意味著數(shù)據(jù)被存儲為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文檔及其數(shù)據(jù)的信息,還可以保留要掛起的XML代碼部分,但您 不想作為文檔的一部分進行處理。
使用XML時的另一個考慮是,當元素值出現(xiàn)時,某些字符無法解析。 例如,您不能在元素的值中包含&符(&),就像我在以下示例中的<FavoriteBook>子元素中所做的那樣:
<?xml version="1.0" encoding="UTF-8"?>
<!-- A list of current clients -->
<People>
<Person id="1234">
<FirstName>John</FirstName>
<LastName>Doe</LastName>
</Person>
<erson id="5678">
<FirstName>Jane</FirstName>
<LastName>Doe</LastName>
<FavoriteBook>Crime & Punishment</FavoriteBook>
</Person>
</People>
如果我嘗試將此XML文檔分配給XML列或變量,則<FavoriteBook>子元素將導致解析器生成錯誤,因為“犯罪&懲罰”值包含&符號。 您必須使用實體引用替換此類型的字符,該實體引用會告知解析器保留原始打算的字符。 實體引用以&符號開頭,以分號結尾,其間包含代表原始值的多字符代碼。 對于&符號,實體參考應該是&amp;,我在下面的例子中使用:
<?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>
請注意,我已經用&amp; 實體參考。 現(xiàn)在XML解析器將處理<FavoriteBook>元素沒有任何問題。 但是請注意,&符號不是唯一會產生錯誤的字符。 XML標準標識了應該用實體引用替換的五個字符,就像我在上面的例子中所做的那樣
????Less than (<): replace with <
????Greater than (>): replace with
????Ampersand (&): replace with &
????Apostrophe ('): replace with '
????Quotation mark ("): replace with "
該示例提出的另一個問題是子元素不一定要從一個父實例到另一個父實例相同。 您可以看到,<Person>元素的第一個實例只包含<FirstName>和<LastName>子元素,但<Person>元素的第二個實例包含<FirstName>和<LastName>子元素,如 以及<FavoriteBook>元素。 只要您的子元素形成良好,您可以包括描述和定義數(shù)據(jù)所需的任何元素。
概要
在本級別中,我們研究了構成XML文檔的主要組件。 元素作為所有XML文檔的基本構建塊,每個元素由開放標簽和結束標簽劃定,數(shù)據(jù)值本身被包含在這兩個標簽之間。 元素可以彼此嵌入,但是一個元素 - 根 - 必須作為XML文檔中所有其他元素的父代。 元素還可以包括被定義為元素的開始標簽的一部分的屬性。
?盡可能方便地了解如何組織一個XML文檔,但是本課程的目的并不是要培養(yǎng)您如何創(chuàng)建這些類型的文檔,而是提供XML簡介,以便您能更有效地工作 在SQL Server中使用XML。 在下一級,我們將介紹如何在SQL Server中實現(xiàn)XML數(shù)據(jù)類型,以及如何將其分配給列和變量以便存儲XML文檔和XML片段。
?????本文是XML樓梯樓梯的一部分
?????注冊我們的RSS Feed,一旦我們在樓梯里發(fā)布一個新的級別,就會收到通知!
?
?
?
?
?
?
轉載于:https://www.cnblogs.com/heqian1025/p/7577015.html
總結
以上是生活随笔為你收集整理的阶梯到XML:1级 - XML简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通过取父级for循环的i来理解闭包,ii
- 下一篇: 201621123058《java程序设