2016-08-02 32 views
2

Ich habe eine Seife XML wie folgt aus:Tsql Abfrage Seife erhalten erste Elementname nach s: Body

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
    <s:Body u:Id="_2"> 
     <TestRecord xmlns="http://tempuri.org/"> 
     </TestRecord> 
    </s:Body> 
</s:Envelope> 

wie kann ich local-name Syntax verwenden, um das erste Element Namen nach s zu erhalten: Body?

sollte es mir TestRecord geben.

Jede Hilfe wird geschätzt.

Antwort

1

//s:Body gibt alle s:Body Knoten zurück und //s:Body/* gibt alle untergeordneten Knoten an alle s:Body Knoten zurück. Fügen Sie das Prädikat [1] hinzu, und Sie erhalten den ersten untergeordneten Knoten eines s:Body-Knotens im Dokument. Verwenden Sie das als Parameter für die Funktion local-name().

declare @X xml; 

set @X = ' 
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" 
      xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
    <s:Body u:Id="_2"> 
    <TestRecord xmlns="http://tempuri.org/"></TestRecord> 
    <TestRecord1 xmlns="http://tempuri.org/"></TestRecord1> 
    </s:Body> 
</s:Envelope>'; 

with xmlnamespaces ('http://www.w3.org/2003/05/soap-envelope' as s) 
select @x.value('local-name((//s:Body/*)[1])', 'varchar(100)'); 
+0

Danke :) für die Erklärung angenommen :) @ tomislav_tv Lösung funktioniert auch – Bravo11

1

sollten Sie in der Lage sein, es wie folgt zu erhalten:

DECLARE @x XML 

SET @x = '<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
    <s:Body u:Id="_2"> 
     <TestRecord xmlns="http://tempuri.org/"> 
     </TestRecord> 
    </s:Body> 
</s:Envelope>' 

;WITH XMLNAMESPACES ('http://www.w3.org/2003/05/soap-envelope' AS s) 
SELECT X.Y.value('(fn:local-name(.))[1]','varchar(max)') 
FROM @x.nodes('/s:Envelope/s:Body/*') X(Y) 

Der Trick ist, den Namensraum mit WITH XMLNAMESPACES angeben und fn zu verwenden: local-name.

+0

Danke :), funktioniert perfekt 1 Stimme für u zu – Bravo11