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

时间:2015-12-25 15:33:43

标签: sql sql-server xml for-xml for-xml-explicit

我正在使用FOR XML EXPLICIT生成XML文档:

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模式是必须的。

1 个答案:

答案 0 :(得分:2)

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

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

  2. 使用xmltext 指令(第4项)代替xml

  3. 列名称为:

    [x!1!foo!xmltext]
    

    完整的查询将是:

    SELECT 1 AS [Tag], NULL AS [Parent]
        , value AS [x!1!foo!xmltext]
    FROM @MyTable
    FOR XML EXPLICIT;
    

    但是如果根元素名称确实不同,则上述方法不是一个选项,似乎唯一的方法是将XML数据转换为NVARCHAR(比VARCHAR更好的选择XMLNVARCHAR都是UTF-16):

    SELECT 1 AS [Tag], NULL AS [Parent]
        , CONVERT(NVARCHAR(MAX), value) AS [x!1!!xml]
    FROM @MyTable
    FOR XML EXPLICIT;
    

    有关详细信息,请参阅Use EXPLICIT Mode with FOR XML的MSDN页面。