第11章-XML數據庫-完成_第1頁
第11章-XML數據庫-完成_第2頁
第11章-XML數據庫-完成_第3頁
第11章-XML數據庫-完成_第4頁
第11章-XML數據庫-完成_第5頁
已閱讀5頁,還剩128頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第11章XML數據庫11.1XML簡介11.2XML文檔11.3DTD-XML模式定義語言11.4XMLSchema-XML模式定義語言11.5Xpath查詢語言11.6XQuery查詢語言11.7XML應用程序接口11.8SQL/XML標準11.9小結11.1XML簡介

11.1.1XML的特點與HTTP相比,XML有如下特點:(1)更多的結構和語義。(2)可擴展性。(3)簡單易用。(4)自描述性。(5)數據與顯示分離。11.1XML簡介11.1.2XML的應用由于XML是一種元語言,可以由使用者自行定義。以下為它的各方面應用:(1)XML/EDI電子數據交換(2)化學標識語言CML和數學標識語言MATHML(3)開放式軟件描述格式OSD(4)通道定義格式CDF(5)開放式財務交換OFX11.1XML簡介11.1.3XML的相關標準(1)XML數據模型

XML可以看作是半結構化數據的特例,但目前沒有公認的很好的數據模型表示它。W3C已經提出的有:XMLInformationSet,XPath1.0DataModel,DOMmodel和XMLQueryDataModel??偟膩碚f,這四種模型都采用樹結構,XMLQueryDataModel是其中較為完全的一種。11.1XML簡介11.1.3XML的相關標準(2)XML模式定義:

XML數據沒有強制性的模式約束。在XML標準中,有一個可選項:DTD(DocumentTypeDefinition),它描述了XML文檔的結構,類似于模式。W3C提出了定義XML模式的另外兩個標準XMLSchema和DocumentContent。11.1XML簡介11.1.3XML的相關標準(2)XML模式定義

Descriptors(DCDs),它們是對DTD的擴展。XMLSchema用XML語法來定義其文檔的模式,支持對結構和數據類型的定義,更適合作為數據模式的定義標準。11.1XML簡介11.1.3XML的相關標準(3)XML查詢語言針對XML數據的特點,學者們已經提出了許多的查詢語言,如XML-QL,XQL,及Quit等。在這些已有的查詢語言基礎上,W3C提出了一種查詢語言XQuery,它結合了其它語言的優點,具有非常強大的能力。11.1XML簡介11.1.3XML的相關標準(3)XML查詢語言XQuery由被稱作查詢模塊的單元組成,這些單元之間彼此相對獨立,可以進行任意層次的嵌套,完成變量綁定、條件判斷、查詢結果構造等功能。XQuery采用了與XPath一致的語法來表示路徑表達式。11.1XML簡介11.1.3XML的相關標準(4)其它標準

W3C提出了與XML相關的一系列標準,內容涉及數據的表示、傳輸、查詢、轉化等許多方面。除了前面提到的外,還有描述XML文檔內和文檔間元素關系的XLink和XPointer,以及XML數據的傳輸協議標準SOAP等許多其它標準。11.1XML簡介11.1.4XML的存儲

XML數據庫是一個能夠在應用中管理XML數據和文檔的數據庫系統,一個XML數據庫是XML文檔及其部件的集合,并通過一個具有能夠管理和控制這個文檔集合本身及其所表示信息的系統來維護。11.1XML簡介11.1.4XML的存儲XML數據庫不僅是結構化數據和半結構化數據的存儲庫,像管理其它數據一樣,持久的XML數據管理包括數據的獨立性、集成性、訪問權限、視圖、完備性、冗余性、一致性以及數據恢復等。11.1XML簡介11.1.4XML的存儲(1)平面文件數據庫平面文件是最簡單的存儲方案,就是在一個文件中存儲整個的XML文檔,以多種文本編輯器和幾個XML工具作為數據操縱工具來實現XML數據的操縱。平面文件存儲方案的優點是實現簡單,但是存在兩個主要的局限性:快速訪問和索引。這也影響了平面文件數據庫的其它方面的能力:有效的日志更新、事務和執行恢復。11.1XML簡介11.1.4XML的存儲(2)XED——面向對象數據庫和關系型數據庫

XED是在原有數據庫基礎上擴展了XML支持模塊,完成XML數據和數據庫之間的格式轉換和傳輸。其存儲粒度可以把整個XML文檔作為RDBMS表中一行,或把XML文檔進行解析后,存儲到相應的表格中。11.1XML簡介11.1.4XML的存儲(2)XED——面向對象數據庫和關系型數據庫 這種存儲方案的優點是效率高、查詢方便、有大量的支持工具。但也存在著一些缺點:將樹狀結構的XML數據轉換成關系數據庫的二維關系表形式時面臨語義信息丟失的問題;XML查詢(例如XPath和XQuery)等不能直接在關系數據庫上執行,需要轉換成SQL查詢;而且其關系表形式的查詢結果還必須得還原成樹狀形式的XML數據;查詢執行和數據存儲的代價會受XML數據的映射方案的影響可能會變得較大。11.1XML簡介11.1.4XML的存儲(3)NXD——專門的XML數據庫管理系統所謂的XML的Native存儲方式,就是存儲時保留數據的樹模型模式。根據一個節點可以直接找到其孩子節點、左右兄弟節點或父親節點等。以Native方式存儲的XML數據,保留XML數據的樹狀模型,并支持XPath和XQuery等XML查詢以讀取數據。存取XML數據,就無需進行數據模式的轉換,也不需要進行查詢語言的轉換。11.2XML文檔XML規范定義了一組語法用于描述文檔的內容和結構。[例1]XML文檔實例<?xmlversion="1.0"encoding="GB2312"?><!DOCTYPENewListSYSTEM"NewList.DTD"><StudentList> <Student> <Sno>2000012</Sno> <Sname>王林</Sname> <Ssex>男</Ssex> <Sage>19</Sage> <Sdept>計算機</Sdept></Student></StudentList>11.2XML文檔XML規范要求XML文檔的第1行必須是一個聲明,用于說明XML文檔所遵從的XML標準版本和語言等。XML文檔的主體是一系列的元素。元素有開始標簽(tag)和結束標簽,標簽又被稱為元素名,兩個標簽之間的部分被叫做元素的內容。開始標簽是一個字符串,并且被封閉在符號’<’和’>’中。結束標簽是在標簽標記字符串之間加上符號’/’。11.2XML文檔在HTML文檔中,標簽是預先定義好的,有固定的含義,可以被瀏覽器所理解。在XML文檔中,標簽需要用戶自己創建。標簽的命名必須遵守下面的規則:可以包含字母,數字和其它字符。不能以數字或者標點符號開頭。不能以XML(或者xml,Xml,xML...)開頭。不能包含空格11.2XML文檔

一個元素可以包含另外的一個元素,稱為元素嵌套,元素之間的嵌套關系是一個層次關系,可以被表示為樹。

XML文檔必須有根元素。元素還可以有任意多個用戶自定義的屬性(Attribute),用于對元素作進一步的描述和說明。

XML中的每個屬性都有自己的名字和值,屬性是開始標簽的一部分。

XML規范要求屬性值必須放在一對引號內。11.2XML文檔屬性的特點有:1.屬性之間的次序是不重要的。一個屬性在同一個元素中不能出現多次。可以聲明屬性類型為ID,這樣的屬性在整個文檔中必須有唯一值。屬性有時可以使得展現更加簡潔。11.2XML文檔除了元素和屬性,XML還允許使用處理指令和注釋。處理指令以”<?”開始,以”?>”結束,中間是處理指令名稱和數據。注釋以”<!--”開始,以”-->”結束,這兩個標記之間是用于注釋的內容,注釋可以出現在文檔中的任何位置。11.3DTD-XML模式定義語言DTD是一種保證XML文檔格式正確的有效方法。一個DTD文檔包含:元素的定義規則,元素之間的嵌套關系的定義規則,元素可使用的屬性,可使用的實體或符號規則等。DTD通過具體說明元素和屬性的名稱、元素與子元素之間的嵌套關系、子元素的出現次數等來定義XML文檔的結構模型。DTD使用操作符*(0次或多次)、+(至少1次)、?(0次或1次)、|(或選)來定義子元素的出現次數。11.3DTD-XML模式定義語言 DTD假設元素的內容和屬性的值都是字符串類型,也提供了一些特殊類型。ANY類型能夠是一個任意XML片段;ID類型說明一個屬性的值在整個文檔中是唯一的,被用來在文檔中惟一標識一個元素。IDREF或IDREFS類型說明屬性的取值為另一個或另幾個元素的ID屬性的值,用于實現該元素對其它元素的引用。

11.3DTD-XML模式定義語言

在DTD中元素類型定義由它們的元素內容模型來描述,其形式為<!ELEMENT元素名(元素內容模型)>

定義屬性時,使用下面的格式:<!ATTLIST元素名(屬性名屬性類型默認聲明)*>11.3DTD-XML模式定義語言

元素名是屬性所屬的元素的名字,屬性名是屬性的命名,屬性類型則用來指定該屬性是屬于有效屬性類型中的哪種類型,默認聲明用來說明該屬性在XML文件中是否可以省略以及默認值是什么。在DTD中共有三種聲明形式:一是#REQUIRED,表示該屬性在XML文件中是必須出現的;二是#IMPLIED,表示該屬性在XML文件中是可以省略的;三是聲明默認屬性值。11.3DTD-XML模式定義語言[例2]XMLDTD實例<!DOCTYPEStudentList[<!ELEMENTStudentList(Student+)><!ELEMENTStudent(Sno,Sname,Ssex,Sage,Sdept,CourseList)><!ELEMENTCourseList(Course+)><!ELEMENTCourse(Cname,Grade)><!ATTLISTCourseCcreditCDATA

#REQUIRED><!ELEMENTSno(#PCDATA)><!ELEMENTSname(#PCDATA)><!ELEMENTSsex(#PCDATA)><!ELEMENTSage(#PCDATA)><!ELEMENTSdept(#PCDATA)><!ELEMENTCname(#PCDATA)><!ELEMENTGrade(#PCDATA)>]>11.4XMLSchema-XML模式定義語言XMLSchema的出現就是為了解決DTD的語法與xml的不一樣這種缺點。

W3C于1998年開始制定XMLSchema的第一個版本,在2001年5月正式由官方推薦。正式推薦的版本包括以下三部分:11.4XMLSchema-XML模式定義語言XMLSchemaPart0:Primer。這是對XMLSchema的非標準介紹,提供了大量示例和說明。XMLSchemaPart1:Structures。這部分描述了XMLSchema的大部分組件。XMLSchemaPart2:Datatypes。這部分包括簡單數據類型,解釋了內置的數據類型和用于限制它們的方面(facet)。11.4XMLSchema-XML模式定義語言[例3]xmlscheme的實例<?xmlversion="1.0"?><xsd:schemaxmlns:xsd="/2001/XMLSchema"> <xsd:elementname="StudentList"> <xsd:complexType> <xsd:sequence> <xsd:elementname="Student"type="StudentType"minOccurs="1"/> </xsd:sequence> </xsd:complexType> </xsd:element></xsd:schema>11.4XMLSchema-XML模式定義語言XMLSchema規范制定了相關的標準描述XML文檔的模式,主要有以下幾個方面:1、元素和屬性在XML模式中用xsd:element元素聲明XML文檔的元素,用xsd:attribute元素聲明XML文檔元素的屬性。這兩個元素名稱在前綴xsd所指向的命名空間中有定義。11.4XMLSchema-XML模式定義語言 在每個xsd:element或xsd:attribute元素中,name和type屬性分別用來說明XML文檔元素或屬性的名稱和數據類型。 每個XML文檔的元素或屬性都有一個數據類型。XMLSchema把元素、屬性的概念和其數據類型分開,這就允許為結構相同的數據定義不同的名稱。11.4XMLSchema-XML模式定義語言

2、數據類型 在XMLSchema中有三種方法來指定元素的數據類型1.通過在元素聲明中指定Type屬性來引用一個已命名的數據類型、內置數據類型或用戶派生數據類型。2.通過定義SimpleType或ComplexType子元素來指定元素的匿名數據類型。3.既不指定Type屬性,也不定義SimpleType或ComplexType子元素。11.4XMLSchema-XML模式定義語言(1)簡單類型簡單類型有三種:原子類型、列表類型和聯合類型。(2)復雜類型復雜類型的元素內容可以包含子元素或屬性。XMLSchema中用complexType元素定義一個復雜類型。它的name屬性用來指定所定義復雜類型的名稱,可以通過內容模型來對復雜類型進行分類。復雜類型子元素的順序和結構稱為它的內容模型。11.4XMLSchema-XML模式定義語言復雜類型的內容模型共有以下四種:1.簡單內容。簡單內容只允許有字符數據,它沒有子元素。2.純元素內容。純元素內容只有子元素而沒有字符數據內容。3.混合內容?;旌蟽热菁仍试S有字符數據又允許有子元素。4.空內容??諆热菁炔辉试S有字符數據也不允許有子元素,這樣的元素通常帶有屬性。11.4XMLSchema-XML模式定義語言(3)匿名與命名數據類型可以是命名的,也可以是匿名的。命名類型總是被定義為全局的,即在模式文檔的最高層,它的父節點總是Schema,并要求具有惟一的名稱。相反,匿名類型則沒有名稱,它們總是在元素或屬性聲明內定義,而且只能被該聲明使用一次。11.4XMLSchema-XML模式定義語言(4)全局與局部

XMLSchema組件有全局和局部之分全局組件出現在模式文檔的最高層在整個模式文檔中,它們的名稱必須在同類組件中是惟一的。 局部組件則限定在包含它們的定義或聲明的作用域內。 簡單類型和復雜類型也可以定義為局部的,這時它們是匿名的。

11.4XMLSchema-XML模式定義語言(4)全局與局部 不能被定義它們的元素和屬性聲明之外的其它元素和屬性聲明引用。 全局的元素聲明和類型定義出現在模式文件的最頂層,它的父元素是Schema局部元素和屬性聲明只出現在復雜類型定義內部。11.5XPath查詢語言

XML查詢語言的功能是在XML文檔中找出滿足指定條件的文檔片段。

Xpath是一種輕量級的XML查詢語言,它使用路徑表達式描述要查找的元素、屬性等,路徑表達式與UNIX文件系統定位文件的方法十分類似,例如,/StudentList/Student/Sno就是一個路徑表達式。11.5Xpath查詢語言11.5.1數據模型為了能按照統一的方式操縱所有的XML文檔,XPath把XML文檔抽象為樹。XML文檔中的元素、屬性、文本、注釋、處理指令、命名空間作為樹中的節點,元素之間的嵌套關系在樹中用節點之間的父/子關系和祖先/后裔關系表示。11.5Xpath查詢語言

11.5.1數據模型此樹的一部分如圖所示rootStudentListsStudentStudentSnoSnameSsexSdeptSageCourseLists2000012計算機王林男19CourseCnameGradeCcredit80英語CourseCnameGradeCcredit70管理學Courses圖11.1一個查詢數據模型實例11.5Xpath查詢語言

11.5.1數據模型對于Xpath的樹模型要注意以下幾點1、樹是有序樹,節點之間的父子關系、兄弟關系必須同它們在文檔中的次序一致,采用深度優先對樹進行遍歷,可以得到原始的文檔。2、根據樹的術語,如果節點P是節點C的父親,則節點C一定是節點P的孩子節點。11.5Xpath查詢語言11.5.1數據模型3、文檔中元素的開始標簽和結束標簽之間的文本在數中用一個節點表示,并作為元素的孩子節點。但是,卻不為屬性的值建立一個節點,屬性的值作為屬性節點的一部分被保存。4、為了更清晰的表示,圖11.1中的每個節點我們只給出一部分內容,實際上,每種節點類型是一個類,有若干個屬性和方法,節點是節點類型的實例。11.5Xpath查詢語言11.5.2路徑表達式 XPath路徑表達式有以下兩種形式: /locationStep1/locationStep2/.....(1) locationStep1/locationStep2/.....(2)11.5Xpath查詢語言11.5.2路徑表達式 形式(1)為絕對路徑表達式,表示從樹模型的根節點開始,如何走到目標節點。 形式(2)為相對路徑表達式,表示從當前節點(又叫做上下文節點)如何走到目標節點。11.5Xpath查詢語言11.5.2路徑表達式路徑表達式由若干個定位步(locationStep)組成,每個定位步指明了下一步要走到哪些節點,定位步的形式為: Axis::nodeSelector[selectionCondition]

定位步的結果是一個節點的集合,這些節點具有相同的節點類型。 XPath定義了13個軸,如下表所示:11.5Xpath查詢語言表11.1XPath的軸(a)軸名稱結果self選取當前節點。parent選取當前節點的父節點。child選取當前節點的所有子節點。ancestor選取當前節點的所有祖先(父、祖父等)ancestor-or-self選取當前節點的所有祖先(父、祖父等)以及當前節點本身descendant選取當前節點的所有后代節點(子、孫等)。descendant-or-self選取當前節點的所有后代節點(子、孫等)以及當前節點本身。preceding選取文檔中當前節點的開始標簽之前的所有節點。11.5Xpath查詢語言preceding-sibling選取當前節點之前的所有同級節點。following選取文檔中當前節點的結束標簽之后的所有節點。following-sibling選擇上下文節點的所有在其后(右)的兄弟,如果上下文節點是屬性節點或命名空間節點,則followin-sibling軸為空。attribute選取當前節點的所有屬性namespace選取當前節點的所有命名空間節點表11.1XPath的軸(b)11.5Xpath查詢語言11.5.2路徑表達式 明確了定位步的語義(即求值方法)后,下面給出XPath路徑表達式語義: 從當前節點出發,找出所有locationStep1到達的節點,對于其中每個節點N,找出所有從N出發,經過locationStep2到達的節點,然后將所有經過locationStep2到達的節點合并,再對合并中的每一個節點,應用locationStep3……直到最后一個步驟,最后一步得到的節點集合就是路徑表達式的結果。11.5Xpath查詢語言[例4]

找到所有Sno節點/child::StudentList/child::Student/child::Sno路徑表達式可以使用簡縮句法,常用的縮減句法有:self::→./child::→//descendant-or-self::node()→//parent::→..attribute::→@謂詞[position()=數值表達式]→[數值表達式]例4的簡寫路徑表達式為:/StudentList/Student/Sno11.5Xpath查詢語言[例5]

找出王林所選修的學分大于4的課程名稱節點 //Student[Sname="王林"]//Course[@Ccredit>"4"]/Cname 將所有的Student節點作為一個集合,從中選擇出有Sname子元素,并且Sname的值等于"王林"的Student節點。把每個篩選出的Student節點作為上下文節點,找到它的后裔節點Course,并且這個后裔節點必須有屬性Ccredit,其值大于4。將滿足條件的Course作為上下文節點,找出其Cname孩子節點。11.5Xpath查詢語言11.5.3XPath函數XPath函數大體上可以分為以下幾類:1、存取函數:各種節點類型共有的函數,用于讀取節點的屬性值。2、錯誤跟蹤函數:對查詢進行Debug,向外部環境傳遞錯誤信息。3、數學函數:常用的數學函數,如abs()。4、字符串函數:用于處理字符串的系列函數,如compare()、concat()。11.5Xpath查詢語言5、布爾值函數:返回邏輯值,如boolean()。6、時間日期函數:用于處理時間和日期的系列函數,如datetime()。7、限定名(QName)相關函數:返回節點的Qname、localname和namespace,如QName()、local-name-from-QName()。8、節點相關函數:返回節點的名字等,如root()、name()。11.5Xpath查詢語言[例6]

返回文檔中第1個學生的信息。

//Student[position()=1][例7]

給出元素Student的限定名、本地名和命名空間的URI。name(//Student) 返回sql:Studentlocal-name((//Student)[1]) 返回Studentnamespace-uri((//Student)[1]) 返回/Student.XML[例8]

給出學號為2000012的Student節點ID("2000012")返回的節點同//Student[1]11.6.1FLWOR表達式

XQuery最有特色且最重要的語法類型之一是FLWOR(讀作flower)表達式,和SQL的select-from-where語句類似,并且具有相似的功能。 FLOWER各字母分別代表for、let、where、order以及return表達式。每個FLWOR表達式都有一個或多個for子句、一個或多個let子句、一個可選的where子句以及一個return子句。11.6XQuery查詢語言1.for子句就像SQL的from子句,在一個序列上變動,序列是項(item)的集合,項可以是節點也可以是原子值。2.let子句將變量直接與一個完整的表達式綁定在一起。與for子句循環遍歷序列中的每個項所不同的是let子句將變量綁定到整個序列。11.6XQuery查詢語言3.where子句如同SQL的where子句一樣,對來自for子句的變量進行過濾。4.order子句能指定結果的順序,這與SQL中的orderby子句非常類似。5.return子句構造XML形式的結果。11.6XQuery查詢語言[例9]

構造一個XML文檔,文檔中描述了每個學生所選修的超過4學分的課程名稱for$Studentindocument("Student.XML")//Studentlet$Sname=$Student/Snamelet$Course=$Student//Course[@Ccredit>="4"]return<CourseInfo>{$Sname}{$Course/Cname}</CourseInfo>11.6XQuery查詢語言將上面的查詢應用于例1的XML文檔,則返回的結果為:<CourseInfo> <Sname>王林</Sname> <Cname>英語</Cname> <Cname>管理學</Cname> <Cname>數據庫原理</Cname> <Cname>離散數學</Cname></CourseInfo><CourseInfo> <Sname>張大民</Sname> <Cname>英語</Cname></CourseInfo>11.6XQuery查詢語言11.6.2連接Student.XML的部分內容<Student> <row> <Sno>2000012</Sno> <Sname>王林</Sname> <Ssex>男</Ssex> <Sage>19</Sage> <Sdept>計算機</Sdept> </row></Student>11.6XQuery查詢語言Course.XML的部分內容<Course> <row> <Cno>1156</Cno> <Cname>英語</Cname> <Cpno></Cpno> <Ccredit>6</Ccredit> </row></Course>11.6XQuery查詢語言SC.XML的部分內容<SC> <row> <Sno>2000012</Sno> <Cno>1156</Cno> <Grade>80</Grade> </row></SC>11.6XQuery查詢語言[例10]

求學生2000012選修的每門課程的名稱和成績<root>for$Cnoindocument("SC.XML")//Sno[text()="2000012"]/Cno,$Courseindocument("Course.XML")//rowwhere$Cno=$Course[Sno="2000012"]/Cnoreturn {$Course/Cname} {$Cno/../Grade}</root>11.6XQuery查詢語言11.6.3嵌套查詢[例11]

求出每位學生的平均成績。<root> for$Snoindocument("Student.XML")//Sno return {$Sno/../Sname} <avgGrade> {avg(document("SC.XML")/row[Sno=$Sno]/Grade)} </avg-Grade></root>11.6XQuery查詢語言11.6.4結果的排序 可以用orderby子句對查詢結果排序。[例12]排序輸出學生的名字。 for$Snameindocument("Student.XML")//Sname orderby$Sname return {$Sname}11.6XQuery查詢語言

隨著XML應用領域的不斷推廣,各種處理XML文檔的編程接口也應運而生。其中JAXP(全稱JavaAPIforXMLProcessing)是使用Java語言編寫的編程接口,JAXP對XML文檔有基于對象(例如,DOM)和基于事件的兩種解析方式?;谑录慕馕龇绞接址譃橥迫胧浇馕觯ɡ鏢AX)和拉出式解析(例如Satx)11.7XML應用程序接口11.7.1SAX SAX是SimpleAPIforXML的縮寫,它并不是由W3C官方所提出的標準,而是在1998年的早些時候由DavidMegginson所提出,目標是成為基于事件驅動的XML文檔解析模式的標準API。

11.7XML應用程序接口11.7.1SAXSAX解析xml如圖11.211.7XML應用程序接口圖11.2SAX解析XML文檔11.7.2DOM DOM(文檔對象模型)是對XML數據的描述體系,它用樹型結構來保存XML文檔。此外,DOM也包括了解析、處理XML數據的API。

DOM整體上的結構是一個Composite模式。所有的XML單元,無論是文檔、元素還是屬性、文本,在DOM中都是一個Node(節點)。11.7XML應用程序接口11.7.2DOMDOM的存儲方式如圖11.311.7XML應用程序接口圖11.3DOM存儲形式11.7.2DOM下面介紹一下如何操作文檔:1、文檔的生成用DOM處理XML數據,需要以下三個步驟1.創建DocumentBuilderFactory。2.創建DocumentBuilder。DocumentBuilder將對輸入實例進行解析以創建Document對象。3.解析輸入的XML,創建Document對象。11.7XML應用程序接口11.7.2DOM2、文檔的遍歷 DOM采用了Composite模式。Node類是所有XML單元的基類,Element、Attr、Document等等都是Node的派生類。每個Node都可以包容其它的Node,也可以包容文本格式的內容。

11.7XML應用程序接口11.7.2DOM

首先要獲取文檔的根節點Document.getDocumentElement()方法。 獲取根節點后,Node.getChildNodes()方法得到該節點的所有直接孩子節點,從而遍歷整個樹型結構。11.7XML應用程序接口11.7.2DOM 在DOM中“元素”是指一對標簽(tag)及其內部包含的字符串值的總和,處理一個元素的內容時,需要兩個步驟:

1.找到代表該元素的節點

2.處理該節點的第一個孩子節點對于樹型數據結構,常見的節點處理就是節點的插入、刪除和替換。

11.7XML應用程序接口11.8.1發布XML文檔

SQL/XML提供了一組函數發布XML文檔 其函數如下:

1、SQL/XML標準 (1)XMLELEMENT和MLATTRIBUTES函數。 這兩個函數分別生成XML文檔的基本構成要素:元素和屬性。

11.8SQL/XML標準11.8.1發布XML文檔

XMLELEMENT函數的基本格式為: XMLELEMENT(Name"<tagname>", [attributeList],<content>) 其中,Name是保留字,tagname是標簽的名字,attributeList是一組屬性名和值,由XMLATTRIBUTES函數生成,content是元素的內容,既可以是字符串,也可以是一組子元素。 XMLATTRIBUTES函數的格式更為簡練,只有一個參數,例如,S.SnoAS"Sno",引號內的Sno是屬性的名字,S.Sno提供了屬性的值。11.8SQL/XML標準11.8.1發布XML文檔(2)XMLGEN函數 XMLGEN函數與XMLELEMENT函數的功能相似,但是XMLGEN函數更簡潔。它的第一個參數是XML文檔模板,模板中有形如{$name}的占位符,其它的參數用于替換占位符。11.8SQL/XML標準11.8.1發布XML文檔(3)XMLFOREST函數

XMLFOREST函數把每個參數轉換成一個XML元素。默認情況下,列名就是元素的名稱,也可以用AS短語為元素命名。(4)XMLCOMMENT函數

XMLCOMMENT函數產生一條注釋。11.8SQL/XML標準11.8.1發布XML文檔(5)XMLPI函數

XMLPI函數用于生成處理指令。(6)XMLNAMESPACES函數

XMLPI函數用于生成命名空間。(7)XMLAGG函數

XMLAGG函數處理同一個分組中的每個元組。11.8SQL/XML標準11.8.1發布XML文檔2、SQLServer2005中的發布方法 在SQLServer中,獲得一個XML類型結果集的最簡單的方法就是使用FORXML命令

FORXML命令的語法如下所示:

[FOR{BROWSE|<XML>}]11.8SQL/XML標準11.8.1發布XML文檔其中,XML的定義如下:<XML>::=XML{{RAW[('ElementName')]|AUTO}[<CommonDirectives>[,{XMLDATA|XMLSCHEMA[(TargetNameSpaceURI)]}][,ELEMENTS[XSINIL|ABSENT]]11.8SQL/XML標準11.8.1發布XML文檔|EXPLICIT[<CommonDirectives>[,XMLDATA]]|PATH[('ElementName')][<CommonDirectives>[,ELEMENTS[XSINIL|ABSENT]]]}11.8SQL/XML標準11.8.1發布XML文檔其中主要的參數如表11.1所示

11.8SQL/XML標準表11.1主要的參數參數名稱含義RAW[('ElementName')]生成XML文檔時,將查詢所得數據集中的每行記錄作為一個元素,且元素的名稱為ElementNameAUTO查詢結果將以XML的層次結構返回給用戶,其中查詢結果中至少有一個字段將被指定為元素,而其它字段可能會被指定為屬性XMLDATA返回XMLSchema類型的XML文檔EXPLICIT為返回的結果集顯式地指定層次關系PATH借助PATH參數,可以通過設計嵌套的FORXML查詢來組織元素和屬性,例如設置用于表示復雜屬性的嵌套方式等ROOT用于指定根元素11.8.1發布XML文檔(1)FORXMLRAW RAW模式將查詢結果集中的每一行轉換為帶有通用標識符<row>或用戶提供的元素名稱的XML元素。默認情況下,行集中非NULL的列值都將映射為<row>元素的一個屬性。11.8SQL/XML標準[例13]查詢所有學生的信息,用XML形式返回。代碼如下: SELECTSno,Sname,Ssex,Sage,SdeptFROMStudentFORXMLRAW11.8SQL/XML標準產生如下結果:<rowSno="2000012"Sname="王林"Ssex="男" Sage="19"Sdept="計算機"/><rowSno="2000113"Sname="張大民"Ssex="男" Sage="18"Sdept="管理"/><rowSno="2000256"Sname="顧芳"Ssex="女" Sage="19"Sdept="管理"/><rowSno="2000278"Sname="姜凡"Ssex="男" Sage="19"Sdept="管理"/><rowSno="2000014"Sname="葛波"Ssex="女" Sage="18"Sdept="計算機"/>11.8SQL/XML標準(2)FORXMLAUTO

如果在將查詢結果集轉換為XML文檔時,使用了AUTO關鍵字,那么查詢結果集將以層次結構的形式組織起來。 選擇所有學生的信息,用XML形式返回。代碼入下: SELECTSno,Sname,Ssex,Sage,Sdept FROMStudent FORXMLAUTO

11.8SQL/XML標準結果如下:<StudentSno="2000012"Sname="王林" Ssex="男"Sage="19"Sdept="計算機"/><StudentSno="2000113"Sname="張大民" Ssex="男"Sage="18"Sdept="管理"/><StudentSno="2000256"Sname="顧芳" Ssex="女"Sage="19"Sdept="管理"/><StudentSno="2000278"Sname="姜凡" Ssex="男"Sage="19"Sdept="管理"/><StudentSno="2000014"Sname="葛波" Ssex="女"Sage="18"Sdept="計算機"/>11.8SQL/XML標準(3)FORXMLEXPLICIT

使用FORXMLEXPLICIT選項后,查詢結果集將被轉換為XML文檔。該XML文檔的結構與結果集中的結果一致。因此,從設計查詢語句時就應開始考慮最終生成的XML文檔。 在EXPLICIT模式中,SELECT語句中的前兩個字段必須分別命名為TAG和PARENT。TAG和PARENT是元數據字段,使用它們可以確定查詢結果集的XML文檔中元素的父子關系,即嵌套關系。11.8SQL/XML標準 其中TAG字段是查詢字段列表中的第一個字段。TAG字段用于存儲當前元素的標記值。標記號可以使用的值是1到255。 PARENT字段用于存儲當前元素的父元素標記號。如果這一列中的值是0或NULL表明相應的元素沒有父級。該元素將作為頂級元素添加到XML。 在添加上述兩個附加字段后,就要定義元素之間的關系,即層次關系。11.8SQL/XML標準 對于層次關系,只需按順序完成以下步驟即可:1、使用TAG字段為每一個將要作為元素在XML文檔中輸出的別名(通常可以使用表名)定義標號。2、使用PARENT字段為本元素指定一個父元素標號,與該標號對應的元素,將成為本元素的父元素(NULL或0表示本元素為根元素)。 重復上面的步驟就可以產生想要的XML文檔。11.8SQL/XML標準 在編寫EXPLICIT模式查詢時,常用格式如下:ElementName!TagNumber!AttributeName!Directive 其中ElementName是所生成元素的通用標識符。例如,如果將ElementName指定為Student,將生成<Student>元素。 TagNumber是分配給元素的唯一標記值。在兩個元數據列(Tag和Parent)的幫助下,此值將確定所得到的XML中的元素的嵌套。 AttributeName提供要在指定的ElementName中構造的屬性的名稱。 Directive是可選的,可以使用它來提供有關XML構造的其它信息。11.8SQL/XML標準 例如查詢所有學生的信息,并且把每列作為一個元素,代碼如下:SELECT1ASTag,0ASParent,Snoas[Student!1!Sno!ELEMENT],SnameAS[Student!1!Sname!ELEMENT],SsexAS[Student!1!Ssex!ELEMENT],SageAS[Student!1!Sage!ELEMENT],Sdeptas[Student!1!Sdept!ELEMENT]FROMStudentFORXMLEXPLICIT11.8SQL/XML標準產生的部分結果如下:<Student> <Sno>2000012</Sno> <Sname>王林</Sname> <Ssex>男</Ssex> <Sage>19</Sage> <Sdept>計算機</Sdept></Student>……11.8SQL/XML標準11.8.1發布XML文檔(4)FORXMLPATH

除選項EXPLICIT之外,SQLServer2005還提供了一種較為簡便的方法來定義元素之間的層次關系,即FORXMLPATH選項。PATH選項使用嵌套的FORXML查詢有機地將元素和屬性組合在一起。

11.8SQL/XML標準1、沒有名稱的列 任何沒有名稱的列都將被內聯。例如,未指定列別名的計算列或嵌套標量查詢將生成沒有名稱的列。如果該列屬于XML類型,則將插入該數據類型的實例的內容。否則,列內容將被作為文本節點插入。 例如: SELECT10+10 FORXMLPATH 結果為: <row>20</row>11.8SQL/XML標準例如上面的代碼可以改為: SELECT10+10 FORXMLPATH('Number')結果為: <Number>20</Number>11.8SQL/XML標準 PATH模式將插入一個XML類型的實例。 SELECT Sno,Sname,PhoneList.query('//Phone[ @type="home"]') FROMStudent FORXMLPATH 產生結果如下: <row> <Sno>2000012</Sno> <Sname>王林</Sname> <Phonetype="home">87654321</Phone> </row>11.8SQL/XML標準2、列名以@符號開頭

如果列名以@符號開頭并且不包含斜杠標記(/),將創建包含相應列值的<row>元素的屬性。例如,以下查詢將返回包含兩列(@Id和Sname)的行集。在生成的XML中,將向相應的<row>元素添加Id屬性并為其分配Sno值。11.8SQL/XML標準SELECTSnoAS"@Id",Sname FROMStudent WHERESno='2000012' FORXMLPATH('Student')產生的部分結果如下:<StudentId="2000012"> <Sname>王林</Sname> </Student> <StudentId="2000113"> <Sname>張大民</Sname></Student>……11.8SQL/XML標準3、列名不以@符號開頭并包含斜杠標記(/) 如果列名不以@符號開頭,但包含斜杠標記(/),則該列名就指明了一個XML層次結構。例如,列名為“Name1/Name2/Name3.../Namen”,其中每個Namei表示嵌套在當前行元素(i=1)中的元素名稱或名為Namei-1的元素下的元素名稱。如果Namen以@開頭,則它將映射到Namen-1元素的屬性。11.8SQL/XML標準例如查詢所有學生的信息。代碼如下:SELECTSno"@Id", Sname"Student/Sname", Ssex"Student/Ssex", Sage"Student/Sage", Sdept"Student/Sdept"FROMStudentFORXMLPATH('StudentList')11.8SQL/XML標準產生的部分結果如下:<StudentListId="2000012"> <Student> <Sname>王林</Sname> <Ssex>男</Ssex> <Sage>19</Sage> <Sdept>計算機</Sdept> </Student></StudentList>……11.8SQL/XML標準4、名稱被指定為通配符的列 如果指定的列名是一個通配符(*),則將像沒有指定列名那樣插入此列的內容。如果此列不是XML類型的列,則此列的內容將作為文本節點插入,如下所示 SELECTSno"@Id",Sname"*" FROMStudent FORXMLPATH('Student')11.8SQL/XML標準結果如下:<StudentId="2000012">王林</Student><StudentId="2000113">張大民</Student><StudentId="2000256">顧芳</Student><StudentId="2000278">姜凡</Student><StudentId="2000014">葛波</Student>11.8SQL/XML標準11.8.2存儲和查詢XML文檔(1)XML數據類型 以下給出了XML數據類型可以使用的方式

1.作為表中的一列

2.作為T-SQL的變量

3.作為存儲過程或者是用戶自定義函數的參數

4.作為用戶自定義函數的返回值11.8SQL/XML標準 在Student表中增加一個列PhoneList,用于存放一個學生的各種聯系電話,這些聯系電話被組織成XML文檔。 CREATETABLEStudent( Sno CHAR(7)PRIMARYKEY, Sname CHAR(8)NOTNULL, Ssex CHAR(2), Sage SMALLINT, Sdept CHAR(20), PhoneList XML);11.8SQL/XML標準例如,向表中插入一個學生的信息:INSERTINTOStudentVALUES('2000012','王林','男',19,'計算機','<PhoneList><Phonetype="home">12345678</Phone><Phonetype="apartment">xxxxxxxx</Phone><Phonetype="mobile">133xxxxxxxx</Phone><Phonetype="mobile">139xxxxxxxx</Phone></PhoneList>');11.8SQL/XML標準11.8.2存儲和查詢XML文檔(2)查詢

SQLServer提供了若干函數對XML數據類型的列進行操縱,與查詢相關的有三個函數,query()、value()和exist()。

Query()方法用于查詢XML實例中滿足一定條件的節點。11.8SQL/XML標準11.8.2存儲和查詢XML文檔(2)查詢 value()方法用于讀取節點的值,并轉換為指定的SQL數據類型。其格式為:value(XQuery,SQLType)。 其中,XQuery參數是XQuery表達式,表達式的結果最多包含一個節點,否則將發生錯誤。SQLType是SQL的數據類型。

11.8SQL/XML標準11.8.2存儲和查詢XML文檔(2)查詢 exist()方法用于判斷查詢結果是否是空集合,根據查詢結果的不同,函數有3種返回值: 0:查詢結果為空集合 1:查詢結果至少包含了一個XML節點 NULL:執行查詢的XML數據類型實例包含 NULL 其格式為:exist(XQuery)`11.8SQL/XML標準[例14]

查詢學生2000012的全部電話信息SELECTPhoneListFROMStudentWHERESno='2000012'11.8SQL/XML標準 PhoneList列的數據類型是XML,查詢結果是一個XML文檔。<PhoneList><Phonetype="home">12345678</Phone><Phonetype="apartment">xxxxxxxx</Phone><Phonetype="mobile">133xxxxxxxx</Phone><Phonetype="mobile">139xxxxxxxx</Phone></PhoneList>11.8SQL/XML標準[例15]

查詢學生2000012的家庭電話SELECTPhoneList.query('//Phone[@type="home"]')FROMStudentWHERESno='2000012';Query()方法返回的是節點的集合,因此,查詢結果為:<Phonetype="home">12345678</Phone>11.8SQL/XML標準[例16]

查詢年學生2000012的家庭電話號碼。SELECTPhoneList.value('(//Phone[@type="mobile"]/text())[1]','varchar(20)')FROMStudentWHERESno='2000012';由于路徑表達式//Phone[@type="mobile"]/text()可能返回多個文本節點,而value函數要求最多只能是一個節點,因此,增加了限制條件[1]。查詢結果是133xxxxxxxx11.8SQL/XML標準[例17]

查詢家庭電話號碼是12345678的學生的姓名SELECTSnameFROMStudentWHEREPhoneList.value('(//Phone[@type="home"]/text())[1]','varchar(20)')='12345678'11.8SQL/XML標準11.8.2存儲和查詢XML文檔(3)XMLDML XQuery1.0規范沒有定義修改XML文檔的語法,目前正在開發相關的工作草案。SQLSever2005提供了modify函數用于修改XML文檔的,其語法類似于XQuery。modify函數可以刪除、增加、替換文檔中的節點。11.8SQL/XML標準1.modify('deleteexpression') expression是一個Xpath表達式,返回一個節點序列,delete命令表示從文檔中刪除節點序列中的所有節點。[例18]

刪除學生王林的所有移動電話。UPDATEStudentSETPhoneList.modify('delete//Phone[@type="mobile"]')WHERESname='王林';11.8SQL/XML標準語句執行后,王林的通訊錄中只有兩部電話(home和apartment兩個電話號碼):<PhoneList><Phonetype="home">12345678</Phone><Phonetype="apartment">xxxxxxxx</Phone></PhoneList>11.8SQL/XML標準2.modify('insertexpression') insert語句將一個節點或者一個有序的序列插入XML文檔,這些新插入的節點作為某個節點的孩子或者兄弟節點。 Insert語句的一般格式如下: InsertExpression1({asfirst|aslast}into|after|before}Expression2)11.8SQL/XML標準 其中,Expression1是要插入的節點或序列,Expression2是要插入的目

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論