2012-06-07 83 views
2

我一直在嘗試使用T-SQL來處理此SOAP XML返回,但是我得到的所有數據都是NULL或什麼都沒有。我嘗試了不同的方法,並將其粘貼在下面。SQL Server 2008查詢肥皂XML

Declare @xmlMsg xml; 

Set @xmlMsg = 
'<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
    <SendWarrantyEmailResponse xmlns="http://Web.Services.Warranty/"> 
     <SendWarrantyEmailResult xmlns="http://Web.Services.SendWarrantyResult"> 
     <WarrantyNumber>120405000000015</WarrantyNumber> 
     <Result>Cannot Send Email to anonymous account!</Result> 
     <HasError>true</HasError> 
     <MsgUtcTime>2012-06-07T01:11:36.8665126Z</MsgUtcTime> 
     </SendWarrantyEmailResult> 
    </SendWarrantyEmailResponse> 
    </soap:Body> 
</soap:Envelope>'; 

declare @table table (data xml); 
insert into @table values (@xmlMsg); 

select data from @table; 

WITH xmlnamespaces ('http://schemas.xmlsoap.org/soap/envelope/' as [soap], 'http://Web.Services.Warranty' as SendWarrantyEmailResponse, 'http://Web.Services.SendWarrantyResult' as SendWarrantyEmailResult) 
SELECT Data.value('(/soap:Envelope[1]/soap:Body[1]/SendWarrantyEmailResponse[1]/SendWarrantyEmailResult[1]/WarrantyNumber[1])[1]','VARCHAR(500)') AS WarrantyNumber 
FROM @Table ; 

;with xmlnamespaces('http://schemas.xmlsoap.org/soap/envelope/' as [soap],'http://Web.Services.Warranty' as SendWarrantyEmailResponse,'http://Web.Services.SendWarrantyResult' as SendWarrantyEmailResult) 
--select @xmlMsg.value('(/soap:Envelope/soap:Body/SendWarrantyEmailResponse/SendWarrantyEmailResult/WarrantyNumber)[0]', 'nvarchar(max)') 
--select T.N.value('.', 'nvarchar(max)') from @xmlMsg.nodes('/soap:Envelope/soap:Body/SendWarrantyEmailResponse/SendWarrantyEmailResult') as T(N) 
select @xmlMsg.value('(/soap:Envelope/soap:Body/SendWarrantyEmailResponse/SendWarrantyEmailResult/HasError)[1]','bit') as test 

;with xmlnamespaces('http://schemas.xmlsoap.org/soap/envelope/' as [soap],'http://Web.Services.Warranty' as [SendWarrantyEmailResponse],'http://Web.Services.SendWarrantyResult' as [SendWarrantyEmailResult]) 
SELECT 
SendWarrantyEmailResult.value('WarrantyNumber[1]','varchar(max)') AS WarrantyNumber, 
SendWarrantyEmailResult.value('Result[1]','varchar(max)') AS Result, 
SendWarrantyEmailResult.value('HasError[1]','bit') AS HasError, 
SendWarrantyEmailResult.value('MsgUtcTime[1]','datetime') AS MsgUtcTime 
FROM @xmlMsg.nodes('/soap:Envelope/soap:Body/SendWarrantyEmailResponse/SendWarrantyEmailResult') SendWarrantyEmailResults(SendWarrantyEmailResult) 

回答

4

嗯,我過會兒重新思考,我想出了答案,所以我敢肯定有人在那裏將尋找這一點。

仔細看一下命名空間的縮寫,這是使所有工作都成功的魔法。希望這可以幫助那裏的人

Declare @xmlMsg xml; 

Set @xmlMsg = 
'<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
    <SendWarrantyEmailResponse xmlns="http://Web.Services.Warranty/"> 
     <SendWarrantyEmailResult xmlns="http://Web.Services.SendWarrantyResult"> 
     <WarrantyNumber>120405000000015</WarrantyNumber> 
     <Result>Cannot Send Email to anonymous account!</Result> 
     <HasError>true</HasError> 
     <MsgUtcTime>2012-06-07T01:11:36.8665126Z</MsgUtcTime> 
     </SendWarrantyEmailResult> 
    </SendWarrantyEmailResponse> 
    </soap:Body> 
</soap:Envelope>'; 

declare @table table (data xml); 
insert into @table values (@xmlMsg); 

select data from @table; 

WITH xmlnamespaces (
'http://schemas.xmlsoap.org/soap/envelope/' as [soap], 
'http://Web.Services.Warranty/' as Resp, 
'http://Web.Services.SendWarrantyResult' as Res) 
SELECT Data.value('(/soap:Envelope/soap:Body/Resp:SendWarrantyEmailResponse/Res:SendWarrantyEmailResult/Res:WarrantyNumber)[1]','VARCHAR(500)') AS WarrantyNumber 
FROM @Table ; 

;with xmlnamespaces(
'http://schemas.xmlsoap.org/soap/envelope/' as [soap], 
'http://Web.Services.Warranty/' as Resp, 
'http://Web.Services.SendWarrantyResult' as Res) 
select @xmlMsg.value('(/soap:Envelope/soap:Body/Resp:SendWarrantyEmailResponse/Res:SendWarrantyEmailResult/Res:WarrantyNumber)[1]', 'nvarchar(max)') 
--select T.N.value('.', 'nvarchar(max)') from @xmlMsg.nodes('/soap:Envelope/soap:Body/SendWarrantyEmailResponse/SendWarrantyEmailResult:SendWarrantyEmailResult') as T(N) 
--select @xmlMsg.value('(/soap:Envelope/soap:Body/SendWarrantyEmailResponse/SendWarrantyEmailResult/SendWarrantyEmailResult:HasError)[1]','bit') as test 

;with xmlnamespaces(
'http://schemas.xmlsoap.org/soap/envelope/' as [soap], 
'http://Web.Services.Warranty/' as Resp, 
'http://Web.Services.SendWarrantyResult' as Res) 
SELECT 
SendWarrantyEmailResult.value('Res:WarrantyNumber[1]','varchar(max)') AS WarrantyNumber, 
SendWarrantyEmailResult.value('Res:Result[1]','varchar(max)') AS Result, 
SendWarrantyEmailResult.value('Res:HasError[1]','bit') AS HasError, 
SendWarrantyEmailResult.value('Res:MsgUtcTime[1]','datetime') AS MsgUtcTime 
FROM @xmlMsg.nodes('/soap:Envelope/soap:Body/Resp:SendWarrantyEmailResponse/Res:SendWarrantyEmailResult') SendWarrantyEmailResults(SendWarrantyEmailResult) 
+0

感謝您回來併發布您的答案。它幫助我解決了我們遇到的問題,並且在人們無法獲得幫助時提供幫助的情況下,它使整個網站更加完善。 – jwhaley58