如何使用sp_xml_preparedocument處理XML文檔

如何使用sp_xml_preparedocument處理XML文檔,很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

公司主營業(yè)務(wù):成都網(wǎng)站建設(shè)、成都做網(wǎng)站、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出埇橋區(qū)免費(fèi)做網(wǎng)站回饋大家。

有時(shí)會在存儲過程中處理一些XML格式的數(shù)據(jù),所以會用到sp_xml_preparedocument,他可以將XML數(shù)據(jù)進(jìn)行讀取,然后使用 MSXML 分析器 (Msxmlsql.dll) 對其進(jìn)行分析。我們就可以很容易的在存儲過程中得到XML中我們想要的數(shù)據(jù)。下面的代碼就是使用sp_xml_preparedocument讀取XML:復(fù)制代碼 代碼如下: DECLARE @hdoc int DECLARE @doc varchar(1000) SET @doc =' <ROOT> <Customer CustomerID="VINET" ContactName="Paul Henriot"> <Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00"> <OrderDetail OrderID="10248" ProductID="11" Quantity="12"/> <OrderDetail OrderID="10248" ProductID="42" Quantity="10"/> </Order> </Customer> <Customer CustomerID="LILAS" ContactName="Carlos Gonzlez"> <Order CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00"> <OrderDetail OrderID="10283" ProductID="72" Quantity="3"/> </Order> </Customer> </ROOT>' EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc

上面只是讀取了XML,要想獲取XML數(shù)據(jù)還需要使用OPENXML,代碼如下:復(fù)制代碼 代碼如下: SELECT * FROM openxml(@hdoc,'/ROOT/Customer',1) WITH (CustomerID VARCHAR(40),ContactName VARCHAR(40))

OPENXML有三個(gè)參數(shù): 第一個(gè)是sp_xml_preparedocument讀取是的OUTPUT參數(shù),在本示例中就是@hdoc; 第二個(gè)是一個(gè)XPath表達(dá)式,用來獲取指定位置的數(shù)據(jù); 第三個(gè)是一個(gè)可選項(xiàng),用來表示獲取的方式,有0,1,2,8四種取值,詳細(xì)解釋請看 FROM后面的WITH也是可選的,用來指定獲取哪些數(shù)據(jù)字段,上面代碼中只取了CustomerID和ContactName。上面的查詢結(jié)果如下: CustomerID ContactName —————————————- —————————————- VINET Paul Henriot LILAS Carlos Gonzlez 如果不指定WITH子句,查詢出來的是一個(gè)默認(rèn)的表結(jié)構(gòu),如下:

表格列的解釋說明:

idbigint文檔節(jié)點(diǎn)的唯一 ID。

根元素的 ID 值為 0。保留負(fù) ID 值。

parentidbigint標(biāo)識節(jié)點(diǎn)的父節(jié)點(diǎn)。此 ID 標(biāo)識的父節(jié)點(diǎn)不一定是父元素。具體情況取決于此 ID 所標(biāo)識節(jié)點(diǎn)的子節(jié)點(diǎn)的節(jié)點(diǎn)類型。例如,如果節(jié)點(diǎn)為文本節(jié)點(diǎn),則其父節(jié)點(diǎn)可能是一個(gè)屬性節(jié)點(diǎn)。

如果節(jié)點(diǎn)位于 XML 文檔的頂層,則其 ParentID為 NULL。

節(jié)點(diǎn)類型int標(biāo)識節(jié)點(diǎn)類型,是對應(yīng)于 XML 對象模型 (DOM) 節(jié)點(diǎn)類型編號的一個(gè)整數(shù)。

下列值是可以顯示在此列中以指明節(jié)點(diǎn)類型的值:

1= 元素節(jié)點(diǎn)

2= 屬性節(jié)點(diǎn)

3= 文本節(jié)點(diǎn)

4= CDATA 部分節(jié)點(diǎn)

5= 實(shí)體引用節(jié)點(diǎn)

6= 實(shí)體節(jié)點(diǎn)

7= 處理指令節(jié)點(diǎn)

8= 注釋節(jié)點(diǎn)

9= 文檔節(jié)點(diǎn)

10= 文檔類型節(jié)點(diǎn)

11= 文檔片段節(jié)點(diǎn)

12= 表示法節(jié)點(diǎn)

有關(guān)詳細(xì)信息,請參閱 Microsoft XML (MSXML) SDK 中的“節(jié)點(diǎn)類型屬性”主題。

localnamenvarchar(max)提供元素或?qū)傩缘谋镜孛Q。如果 DOM 對象沒有名稱,則為 NULL。prefixnvarchar(max)節(jié)點(diǎn)名稱的命名空間前綴。namespaceurinvarchar(max)節(jié)點(diǎn)的命名空間 URI。如果值是 NULL,則命名空間不存在。datatypenvarchar(max)元素或?qū)傩孕械膶?shí)際數(shù)據(jù)類型,否則是 NULL。數(shù)據(jù)類型是從內(nèi)聯(lián) DTD 中或從內(nèi)聯(lián)架構(gòu)中推斷得出。prevbigint前一個(gè)同級元素的 XML ID。如果前面沒有同級元素,則為 NULL。textntext包含文本形式的屬性值或元素內(nèi)容。如果邊緣表項(xiàng)不需要值則為 NULL。

列名數(shù)據(jù)類型說明

在WITH子句中,我們還可以通過設(shè)置來獲取父級元素的屬性值:復(fù)制代碼 代碼如下: DECLARE @hdoc int DECLARE @doc varchar(1000) SET @doc =' <ROOT> <Customer CustomerID="VINET" ContactName="Paul Henriot"> <Order OrderID="10248" CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00"> <OrderDetail ProductID="11" Quantity="12"/> <OrderDetail ProductID="42" Quantity="10"/> </Order> </Customer> <Customer CustomerID="LILAS" ContactName="Carlos Gonzlez"> <Order OrderID="10283" CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00"> <OrderDetail ProductID="72" Quantity="3"/> </Order> </Customer> </ROOT>' EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc SELECT * FROM OPENXML (@hdoc, '/ROOT/Customer/Order/OrderDetail',2) WITH (OrderID int '../@OrderID', CustomerID varchar(10) '../@CustomerID', OrderDate datetime '../@OrderDate', ProdID int '@ProductID', Qty int '@Quantity')

查詢的結(jié)果為: OrderID CustomerID OrderDate ProdID Qty ———– ———- ———————– ———– ———– 10248 VINET 1996-07-04 00:00:00.000 11 12 10248 VINET 1996-07-04 00:00:00.000 42 10 10283 LILAS 1996-08-16 00:00:00.000 72 3 有時(shí)候XML中的數(shù)據(jù)并不是以屬性的方式存在,而是直接放在節(jié)點(diǎn)中,如下:復(fù)制代碼 代碼如下: DECLARE @doc varchar(1000) SET @doc =' <ROOT> <Customer CustomerID="VINET" ContactName="Paul Henriot"> <Order> <OrderID>10248</OrderID> <CustomerID>VINET</CustomerID> <EmployeeID>5</EmployeeID> <OrderDate>1996-07-04T00:00:00</OrderDate> </Order> </Customer> </ROOT>'

此時(shí)要獲Order節(jié)點(diǎn)下的各項(xiàng)的值,可以用下面方法:復(fù)制代碼 代碼如下: DECLARE @hdoc int DECLARE @doc varchar(1000) SET @doc =' <ROOT> <Customer CustomerID="VINET" ContactName="Paul Henriot"> <Order> <OrderID>10248</OrderID> <CustomerID>VINET</CustomerID> <EmployeeID>5</EmployeeID> <OrderDate>1996-07-04T00:00:00</OrderDate> </Order> </Customer> </ROOT>' EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc SELECT * FROM OPENXML (@hdoc, '/ROOT/Customer/Order',1) WITH (OrderID int 'OrderID', CustomerID varchar(10) 'CustomerID', EmployeeID int 'EmployeeID', OrderDate datetime 'OrderDate')

查詢結(jié)果如下: OrderID CustomerID EmployeeID OrderDate ———– ———- ———– ———————– 10248 VINET 5 1996-07-04 00:00:00.000 可以看出是取屬性值還是取節(jié)點(diǎn)的文本的值區(qū)別在于WITH子句的第三個(gè)參數(shù)是否有@符號

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。

網(wǎng)頁標(biāo)題:如何使用sp_xml_preparedocument處理XML文檔
當(dāng)前鏈接:http://bm7419.com/article36/jdiepg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、網(wǎng)站制作、服務(wù)器托管、定制網(wǎng)站App開發(fā)、手機(jī)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)