2011-11-07 3 views
2

J'essaie d'obtenir le texte 'Response' à partir d'une réponse SOAP dans SQL Server mais je ne peux pas utiliser soap: Envelope à cause des erreurs d'analyse de SQL Server.Analyse XML SOAP dans SQL Server

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

Ma réponse XML est la suivante et est contenu dans un nvarchar appelé @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> 

Je suis en train de se Method1Result dans un nvarchar mais je suis vraiment du mal à lire ce code 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 

Voici comment je l'ai lu normalement mes variables XML dans SQL, mais dès que j'essaie de lire soap: Envelope je reçois cette erreur:

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

Répondre

1

Si vous utilisez SQL Server 2005 ou version ultérieure vous pouvez le faire à la place.

;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) 

Ou un peu plus simple/plus rapide si vous attendez seulement la valeur de Method1Result dans le 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)') 
+0

Merci pour cela. La méthode 1 fonctionne parfaitement sur SQL2008. – Elarys

+0

Comme question secondaire, comment utilisez-vous l'exemple ci-dessus pour obtenir le texte faultstring à partir de soap: Fault. Je pensais que cela le ferait, mais il ne retourne aucune valeur du tout. ; avec xmlnamespaces ('http://schemas.xmlsoap.org/soap/envelope/' as [soap], par défaut 'http://tempuri.org/') select @ xDoc.value ('(/ soap: Enveloppe/soap: Corps/soap: Fault/faultstring) [1] ',' nvarchar (max) ') – Elarys

+0

@Elarys - XML ​​est sensible à la casse. Peut-être devrait-il être 'FaultString'. –