2011-11-07 96 views
2

我試圖從SQL Server中的SOAP響應中獲取「響應」文本,但因爲從SQL Server解析錯誤而無法使用soap:Envelope。在SQL Server中解析SOAP XML

XML parsing error: Reference to undeclared namespace prefix: 'soap'.

我的XML迴應如下,並且包含在所謂@xmlOut一個nvarchar:

<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> 
    <Method1Response xmlns="http://tempuri.org/"> 
    <Method1Result>&lt;Interface&gt;&lt;Col1&gt;#result#&lt;/Col1&gt;&lt;Col2&gt;info&lt;/Col2&gt;&lt;Col3&gt;Record is invalid.&lt;/Col3&gt;&lt;Col4&gt;&lt;/Col4&gt;&lt;/Interface&gt;</Method1Result> 
    </Method1Response> 
</soap:Body> 
</soap:Envelope> 

我試圖讓Method1Result成一個nvarchar但我真的閱讀本XML掙扎。

declare @xDoc as xml 
set @xDoc = cast(@xmlOut as xml) 

declare @hdoc int 
exec sp_xml_preparedocument @hdoc OUTPUT, @xDoc 

select * 
from 
( select * 
    from openxml(@hdoc, '/soap:Envelope/soap:Body/MethodResponse', 1) 
    with (MethodResult nvarchar(max)) 
) as x 

exec sp_xml_removedocument @hdoc 

這是怎麼了,我通常讀我的XML變量在SQL,但只要我嘗試閱讀肥皂:信封我得到這個錯誤:

XML parsing error: Reference to undeclared namespace prefix: 'soap'.

回答

1

如果你使用SQL Server 2005或更高版本你可以這樣做。

;with xmlnamespaces('http://schemas.xmlsoap.org/soap/envelope/' as [soap], 
        default 'http://tempuri.org/') 
select T.N.value('.', 'nvarchar(max)') 
from @xDoc.nodes('/soap:Envelope/soap:Body/Method1Response/Method1Result') as T(N) 

或者如果您只希望XML中的Method1Result的值更簡單/更快一點。

;with xmlnamespaces('http://schemas.xmlsoap.org/soap/envelope/' as [soap], 
        default 'http://tempuri.org/') 
select @xDoc.value('(/soap:Envelope/soap:Body/Method1Response/Method1Result)[1]', 'nvarchar(max)') 
+0

謝謝。方法1在SQL2008上完美工作。 – Elarys

+0

作爲第二個問題,您如何使用上述示例從soap中獲取faulttring文本:Fault。 我認爲這樣做,但它沒有返回任何值。 ; with xmlnamespaces('http://schemas.xmlsoap.org/soap/envelope/'as [soap], 默認'http://tempuri.org/') select @ xDoc.value('(/ soap:Envelope/soap:Body/soap:Fault/faultstring)[1]','nvarchar(max)') – Elarys

+0

@Elarys - XML區分大小寫。也許它應該是'FaultString'。 –