提问人:GriGrim 提问时间:12/25/2015 最后编辑:Solomon RutzkyGriGrim 更新时间:12/27/2015 访问量:2322
使用 FOR XML EXPLICIT 时删除 xmlns=“” 名称空间声明
Remove xmlns="" name space declaration when using FOR XML EXPLICIT
问:
我正在使用以下方法生成XML文档:FOR XML EXPLICIT
declare @MyTable table (value xml);
insert into @MyTable values
('<foo bar="data1">content1</foo>')
,('<foo bar="data2">content2</foo>')
,('<foo bar="data3">content3</foo>');
select 1 as Tag, null as Parent
, value as [x!1!!xml]
from @MyTable
for xml explicit;
并得到这样的回应:
<x>
<foo bar="data1" xmlns="">content1</foo>
</x>
<x>
<foo bar="data2" xmlns="">content2</foo>
</x>
<x>
<foo bar="data3" xmlns="">content3</foo>
</x>
问题是我不需要这个属性。xmlns
我找到了一个解决方案,但这似乎是一个笨蛋。
select 1 as Tag, null as Parent
, cast (value as varchar(200)) as [x!1!!xml]
from @MyTable
for xml explicit;
有没有更优雅的方法来解决问题?
请勿使用 .FOR XML PATH/RAW/AUTO
EXPLICIT
模式是必须的。
答:
2赞
Solomon Rutzky
12/26/2015
#1
如果根元素名称(即 在 Question) 中的示例数据中,所有行都相同,那么有一种简单的方法可以实现此目的:foo
在列名称中指定 AttributeName 项(第 3 项)。就示例数据而言,这将是 .
foo
使用指令(第 4 项)而不是 .
xmltext
xml
列名称为:
[x!1!foo!xmltext]
完整的查询将是:
SELECT 1 AS [Tag], NULL AS [Parent]
, value AS [x!1!foo!xmltext]
FROM @MyTable
FOR XML EXPLICIT;
但是,如果根元素名称确实有所不同,则上述方法不是一个选项,似乎唯一的方法是将 XML 数据转换为(比 since 和 UTF-16 更好的选择):NVARCHAR
VARCHAR
XML
NVARCHAR
SELECT 1 AS [Tag], NULL AS [Parent]
, CONVERT(NVARCHAR(MAX), value) AS [x!1!!xml]
FROM @MyTable
FOR XML EXPLICIT;
有关详细信息,请参阅将 EXPLICIT 模式与 FOR XML 配合使用的 MSDN 页面。
评论
1赞
GriGrim
12/26/2015
伟大!根元素不会变化。Xmltext 解决了这个问题。谢谢。
评论