2016-08-02 40 views
2

我有一個肥皂這樣的XML:TSQL查詢肥皂獲得第一個元素名稱年代後:身體

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

我怎麼可以使用本地名語法年代後拿到的第一個元素名稱:身體?

它應該給我TestRecord。

任何幫助表示讚賞。

回答

1

//s:Body返回所有s:Body節點並且//s:Body/*返回所有s:Body節點的子節點。添加謂詞[1],您將在文檔中獲得s:Body節點的第一個子節點。將其用作函數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

謝謝:)接受的解釋:),@ tomislav_tv的解決方案的工作太 – Bravo11

1

你應該能夠得到這樣的:

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) 

訣竅是用XMLNAMESPACES指定命名空間和使用FN:本地名。

+0

謝謝:),可以完美1個投票支持吳太 – Bravo11