从 SQL 中的 XML 对象获取命名空间
Fetch namespace from XML object in SQL
考虑以下 XML
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<Action xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none" s:mustUnderstand="1">http://xmlns.scania.com/management/messages/v3</Action>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Data xmlns="http://xmlns.scania.com/management/schema/messages/v3">
<Details />
</Data>
</s:Body>
</s:Envelope>
我正在尝试获取信封下标签的 xmlns 值中的命名空间值。
我尝试使用
XMLObject.value('namespace-uri((/*:Envelope)[1])', 'varchar(100)')
这 returns 第一个元素的 xmlns。即 "http://schemas.xmlsoap.org/soap/envelope/"
我需要深入了解标签的 xmlns。即 "http://xmlns.scania.com/management/schema/messages/v3"
有人可以帮我解决这个问题吗?
这里有三种方法 select 您的命名空间 URI...
declare @xml xml = N'<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<Action xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none" s:mustUnderstand="1">http://xmlns.scania.com/management/messages/v3</Action>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Data xmlns="http://xmlns.scania.com/management/schema/messages/v3">
<Details />
</Data>
</s:Body>
</s:Envelope>';
-- Avoid this: wildcard namespaces are slow...
select Envelope.value('namespace-uri(.)', 'nvarchar(max)') as NamespaceUri
from @xml.nodes('/*:Envelope/*:Body/*:Data') soap(Envelope);
-- Declare namespace(s) inside the XPath expression...
select Envelope.value('namespace-uri(.)', 'nvarchar(max)') as NamespaceUri
from @xml.nodes('declare namespace soap="http://schemas.xmlsoap.org/soap/envelope/";
/soap:Envelope/soap:Body/*:Data') soap(Envelope);
-- Declare namespace(s) before the query (these would be usable in FOR XML as well)...
with xmlnamespaces(
'http://schemas.xmlsoap.org/soap/envelope/' as soap
)
select Envelope.value('namespace-uri(.)', 'nvarchar(max)') as NamespaceUri
from @xml.nodes('/soap:Envelope/soap:Body/*:Data') soap(Envelope);
考虑以下 XML
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<Action xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none" s:mustUnderstand="1">http://xmlns.scania.com/management/messages/v3</Action>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Data xmlns="http://xmlns.scania.com/management/schema/messages/v3">
<Details />
</Data>
</s:Body>
</s:Envelope>
我正在尝试获取信封下标签的 xmlns 值中的命名空间值。 我尝试使用
XMLObject.value('namespace-uri((/*:Envelope)[1])', 'varchar(100)')
这 returns 第一个元素的 xmlns。即 "http://schemas.xmlsoap.org/soap/envelope/"
我需要深入了解标签的 xmlns。即 "http://xmlns.scania.com/management/schema/messages/v3"
有人可以帮我解决这个问题吗?
这里有三种方法 select 您的命名空间 URI...
declare @xml xml = N'<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<Action xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none" s:mustUnderstand="1">http://xmlns.scania.com/management/messages/v3</Action>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Data xmlns="http://xmlns.scania.com/management/schema/messages/v3">
<Details />
</Data>
</s:Body>
</s:Envelope>';
-- Avoid this: wildcard namespaces are slow...
select Envelope.value('namespace-uri(.)', 'nvarchar(max)') as NamespaceUri
from @xml.nodes('/*:Envelope/*:Body/*:Data') soap(Envelope);
-- Declare namespace(s) inside the XPath expression...
select Envelope.value('namespace-uri(.)', 'nvarchar(max)') as NamespaceUri
from @xml.nodes('declare namespace soap="http://schemas.xmlsoap.org/soap/envelope/";
/soap:Envelope/soap:Body/*:Data') soap(Envelope);
-- Declare namespace(s) before the query (these would be usable in FOR XML as well)...
with xmlnamespaces(
'http://schemas.xmlsoap.org/soap/envelope/' as soap
)
select Envelope.value('namespace-uri(.)', 'nvarchar(max)') as NamespaceUri
from @xml.nodes('/soap:Envelope/soap:Body/*:Data') soap(Envelope);