2014-11-03 31 views
0

我有xml作爲webservice api的結果。我需要解析結果並更新到數據庫表。我的xml在下面。它是一個響應文本。如何在sql服務器中讀取此xml

<?xml version="1.0" encoding="utf-8"?> 
<double>1</double> 

sqlserver的2008代碼:

declare @xml xml, @rate DECIMAL(10,4) 
    set @xml=REPLACE(@ResponseText ,'encoding="utf-8"','') 
    select @rate= @xml.value('(/double)[1]','decimal') 

我想要得到的雙重價值,但它總是返回NULL。

請幫我一把。

嗨,有完成更改根據您的建議仍然沒有得到。

declare @xml XML 
DECLARE @responsetext VARCHAR(900) 

declare @rate DECIMAL(10,4) 
SET @responsetext = '<?xml version="1.0" encoding="utf-8"?> 
    <double xmlns="http://www.webserviceX.NET/">1</double>' 
set @xml=REPLACE(@ResponseText ,'encoding="utf-8"','') 
select @rate= @xml.value('(/double)[1]','decimal') 
select @rate 
+0

我試過一個變種螞蟻在你的代碼,我得到1,而不是NULL。你確定這是XML被送入'@ ResponseText'嗎?在此之前嘗試一個'PRINT @ ResponseText'來驗證。你如何填充'@ ResponseText'? – 2014-11-03 12:14:54

+0

我的建議有效嗎?如果可以,請將我的答案標記爲已接受?謝謝。 – 2014-11-04 06:42:58

回答

1
DECLARE @X XML = '<?xml version="1.0" encoding="utf-8"?> 
<double xmlns="http://www.webserviceX.NET/">1</double>' 

SELECT @X.value ('declare namespace x="http://www.webserviceX.NET/"; (/x:double)[1]', 'decimal') 

更新以反映您的命名空間的使用;一般的觀點是你不需要做字符串操作來完成這項工作。頭部完全受支持。但是,名稱空間很重要。

+0

嗨斯圖爾特,請檢查編輯的代碼 – 2014-11-03 12:39:47

+0

完成;命名空間改變東西:) – 2014-11-03 23:13:30

1

不是一個答案,只是一些示例代碼 - 這個返回1,而不是一個NULL:

declare @xml xml,  @rate DECIMAL(10,4) 
declare @ResponseText varchar(900) 

set @ResponseText = '<?xml version="1.0" encoding="utf-8"?> <double>1</double>' 

set @xml=REPLACE(@ResponseText ,'encoding="utf-8"','') 
select @rate= @xml.value('(/double)[1]','decimal') 
select @rate 
+0

嗨尼克,我已經更新了代碼。但仍面臨同樣的問題。在 – 2014-11-03 12:40:21

+0

以上完成的代碼更改編號您的原始XML樣本不包含'xmlns =「http://www.webserviceX.NET/」'。如果你把它留在NULL中,如果你把它拿出來,你會得到1.如果你遵循Sveins的建議,你可以留下它,你會得到1. Svein有答案。在將來發布所有代碼。 – 2014-11-03 22:59:54

2

使用value()方法查詢時,您需要聲明的命名空間。

'(/double)[1]' 

變化值()的第一個參數

'declare namespace x="http://www.webserviceX.NET/"; (/x:double)[1]' 

所以完整的例子看起來像這樣

declare @xml XML 
DECLARE @responsetext VARCHAR(900) 

declare @rate DECIMAL(10,4) 
SET @responsetext = '<?xml version="1.0" encoding="utf-8"?> 
    <double xmlns="http://www.webserviceX.NET/">1</double>' 
set @xml=REPLACE(@ResponseText ,'encoding="utf-8"','') 
select @rate= @xml.value('declare namespace x="http://www.webserviceX.NET/"; (/x:double)[1]','decimal') 
select @rate 

應返回1.000(十進制)