【问题标题】:Remove xmlns="" name space declaration when using FOR XML EXPLICIT使用 FOR XML EXPLICIT 时删除 xmlns="" 名称空间声明
【发布时间】:2016-03-31 13:36:29
【问题描述】:

我正在使用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 模式是必须的。

【问题讨论】:

  • 你能解释一下这个限制吗必须使用显式模式不提供使用 FOR XML PATH/RAW/AUTO
  • 使用 EXPLICIT 模式将层次结构数据转换为 xml 要容易得多。并且作为一个实验。

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


【解决方案1】:

如果根元素名称(即问题示例数据中的foo)在所有行中都相同,那么有一个简单的方法可以完成此操作:

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

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

列名将是:

[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 页面。

【讨论】:

  • 太棒了!根元素不变。 Xmltext 解决了这个问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 2019-05-15
  • 2011-07-13
相关资源
最近更新 更多