【问题标题】:How can I specify namespace not in root tag?如何指定不在根标签中的命名空间?
【发布时间】:2019-11-12 14:02:34
【问题描述】:

如何获得具有以下结构的 XML:

<Test xmlns="http://default.namespace.com">
    <Child xmlns:ovrd="http://overridden.namespace.com">
        <ovrd:GrandChild>123</ovrd:GrandChild>
    </Child>
</Test>

据我了解,WITH NAMESPACES 只允许在根标签中添加命名空间。

create table Children (
    Id int, 
    GrandChild varchar(50)
)
GO

insert into Children values (1, '123')

GO

WITH XMLNAMESPACES (
        default 'http://default.namespace.com'      
)  
select GrandChild as 'Child/GrandChild'
from Children
where id = 1
for xml PATH('Test'), ELEMENTS XSINIL

我需要在Child 标签中以某种方式指定命名空间

【问题讨论】:

  • 您需要提供 DDL 和样本数据总体。

标签: sql sql-server xml


【解决方案1】:

XQuery 来救援。它允许在不同级别上指定多个命名空间。

SQL

-- DDL and sample data population, start
DECLARE @mockChildren TABLE  (
    Id INT, 
    GrandChild VARCHAR(50)
)

INSERT INTO @mockChildren VALUES (1, '123');
-- DDL and sample data population, end


;WITH XMLNAMESPACES (DEFAULT 'http://default.namespace.com')  
SELECT (
    SELECT GrandChild AS 'GrandChild'
    FROM @mockChildren
    WHERE id = 1
    FOR XML PATH('row'), TYPE, ROOT('root')
).query('<Test xmlns="http://default.namespace.com">
{ 
    for $r in /root/row
    return 
    <Child xmlns:ovrd="http://overridden.namespace.com">
        <ovrd:GrandChild>
            {data($r/GrandChild)}
        </ovrd:GrandChild>
    </Child>
}
</Test>');

XML 输出

<Test xmlns="http://default.namespace.com">
  <Child xmlns:ovrd="http://overridden.namespace.com">
    <ovrd:GrandChild>123</ovrd:GrandChild>
  </Child>
</Test>

【讨论】:

  • 很棒的方法,从我这边+1...我会很高兴有一些本机功能来控制命名空间的显示位置和方式...
猜你喜欢
  • 1970-01-01
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多