SQL Server中XML中的自关闭标记

时间:2012-12-21 05:51:31

标签: xml sql-server-2008

我正在使用SQL Query在SQL Server中使用XML返回结果。我使用下面的SQL Query-

SELECT '1' AS [Column1]
UNION
SELECT '2' AS [Column2]
UNION
SELECT '' AS [Column3]
FOR XML PATH('Test'), ROOT('Rows')

结果XML:

  <Rows>
    <Test>
      <Column1></Column1>
    </Test>
    <Test>
      <Column1>1</Column1>
    </Test>
    <Test>
      <Column1>2</Column1>
    </Test>
  </Rows>

输出就像:

  <Rows>
    <Test>
      <Column1/>
    </Test>
    <Test>
      <Column1>1</Column1>
    </Test>
    <Test>
      <Column1>2</Column1>
    </Test>
  </Rows>

任何帮助都会受到赞赏。在此先感谢。

3 个答案:

答案 0 :(得分:3)

实际上如果我们内置XML,那么它将返回Tag作为自闭。请参阅以下SQL代码:

DECLARE @TempData Table
(
Column1 NVARCHAR(250)
)
INSERT INTO @TempData values('Column1')
INSERT INTO @TempData values('Column2')
INSERT INTO @TempData values('')
SELECT
(
SELECT * FROM @TempData FOR XML PATH('Test'), Type
)
For XML PATH (''),
ROOT('Rows')

输出:

<Rows>
  <Test>
    <Column1>Column1</Column1>
  </Test>
  <Test>
    <Column1>Column2</Column1>
  </Test>
  <Test>
    <Column1 />
  </Test>
</Rows>

答案 1 :(得分:1)

我认为结果是正确的,你选择一个空字符串尝试选择null:

SELECT '1' AS [Column1]
UNION
SELECT '2' AS [Column2]
UNION
SELECT NULL AS [Column3]
FOR XML PATH('Test'), ROOT('Rows')

结果:

<Rows>
  <Test />
  <Test>
    <Column1>1</Column1>
  </Test>
  <Test>
    <Column1>2</Column1>
  </Test>
</Rows>

这甚至可以少得多。


因为您不想删除标签,请在此处尝试:

declare @output nvarchar(max)

declare @XML xml = '
  <Rows>
    <Test>
      <Column1></Column1>
    </Test>
    <Test>
      <Column1>1</Column1>
    </Test>
    <Test>
      <Column1>2</Column1>
    </Test>
  </Rows>'

set @output = replace(cast(@XML as nvarchar(max)), '<Column1></Column1>', '<Column1/>')

select @output

很抱歉对xml结果进行硬编码我现在无法想象如何动态地将输出设置为@XML。

答案 2 :(得分:0)

首先,正如@ marc-s在评论中所提到的,根据XML规范,两种表示在语义上都是等效的。

  

空元素的表示形式是起始标记   紧接着是一个结束标记或一个空元素标记。

http://www.w3.org/TR/REC-xml/#NT-content

另见:

https://stackoverflow.com/a/2279530/2266979

在评论中,您澄清了自闭标签表示涉及较少的字符。

只有在SQL Server之外使用XML时才会这么做,因为在服务器中它“内部存储为二进制格式”(https://technet.microsoft.com/en-US/library/ms345115(v=SQL.90).aspx)。

如果您在SQL Server之外使用XML,这些字符很重要,您可能已将其转换为文本。但是,当您这样做时,SQL Server(2008,无论如何)会自动使用自动关闭标记。

例如:

SELECT CONVERT(varchar(max),CONVERT(xml,'<tag></tag>'));

将返回:

<tag/>

所以您需要做的就是将最终结果转换为文本。

这假设您已键入XML。如果使用FOR XML PATH创建XML而不指定TYPE关键字,则基本上只是生成类似于XML的文本。

所以这个:

SELECT CONVERT(varchar(max),(SELECT '' AS 'tag' FOR XML PATH('')));

将返回:

<tag></tag>

如果您改为使用TYPE关键字:

SELECT CONVERT(varchar(max),(SELECT '' AS 'tag' FOR XML PATH(''), TYPE));

你会得到:

<tag/>