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

tsql查询soap在s:Body之后获取第一个元素名,sql,tsql,xpath,xml-namespaces,Sql,Tsql,Xpath,Xml Namespaces,我有这样一个soap 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">

我有这样一个soap 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>
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)
如何使用本地名称语法获取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>
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:local name。

/s:Body返回所有s:Body节点,//s:Body/*将所有子节点返回给所有s:Body节点。添加谓词[1],您将获得文档中s:Body节点的第一个子节点。将其用作函数本地名称的参数


谢谢:接受解释:,@tomislav_tv的解决方案也有效