sql查询soap在s:Body之后获取第一个元素名称

tsql query soap get first element name after s:Body

我有一块肥皂XML是这样的:

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

如何使用本地名称语法获取 s:Body 之后的第一个元素名称?

它应该给我 TestRecord。

感谢任何帮助。

你应该可以这样得到它:

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)

诀窍是使用 WITH XMLNAMESPACES 指定命名空间并使用 fn:local-name.

//s:Body returns 所有 s:Body 节点和 //s:Body/* returns 所有 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)');