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)');
我有一块肥皂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)');