使用 FOR XML EXPLICIT 时删除 xmlns=“” 名称空间声明

Remove xmlns="" name space declaration when using FOR XML EXPLICIT

提问人:GriGrim 提问时间:12/25/2015 最后编辑:Solomon RutzkyGriGrim 更新时间:12/27/2015 访问量:2322

问:

我正在使用以下方法生成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模式是必须的。

sql sql-server for-xml for-xml-explicit

评论

0赞 Pரதீப் 12/26/2015
您能否解释一下此限制 EXPLICIT 模式是必须的,并且不使用 FOR XML PATH/RAW/AUTO 提供
0赞 GriGrim 12/26/2015
使用 EXPLICIT 模式将分层数据转换为 xml 要容易得多。也是一种实验。

答:

2赞 Solomon Rutzky 12/26/2015 #1

如果根元素名称(即 在 Question) 中的示例数据中,所有行都相同,那么有一种简单的方法可以实现此目的:foo

  1. 在列名称中指定 AttributeName 项(第 3 项)。就示例数据而言,这将是 .foo

  2. 使用指令(第 4 项)而不是 .xmltextxml

列名称为:

[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 更好的选择):NVARCHARVARCHARXMLNVARCHAR

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 解决了这个问题。谢谢。