Разбор SOAP XML в SQL Server - PullRequest
       6

Разбор SOAP XML в SQL Server

2 голосов
/ 07 ноября 2011

Я пытаюсь получить текст «Ответ» из ответа SOAP в SQL Server, но не могу использовать soap: Envelope из-за ошибки синтаксического анализа из SQL Server.

Ошибка синтаксического анализа XML: ссылка на необъявленный префикс пространства имен: 'soap'.

Мой XML-ответ выглядит следующим образом и содержится в nvarchar с именем @xmlOut:

<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, но как только я пытаюсь прочитать soap: Envelope, я получаю эту ошибку:

Ошибка синтаксического анализа XML: ссылка на необъявленный префикс пространства имен: 'soap'.

1 Ответ

1 голос
/ 07 ноября 2011

Если вы используете 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)

Или немного проще / быстрее, если вы ожидаете только значение Method1Result в XML.

;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)')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...