tsql查询soap在s:Body之后获取第一个元素名
我有这样一个soap XML: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">
<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的解决方案也有效