如何删除不必要的空命名空间并在SQL中添加名称空间前缀

时间:2013-11-28 22:16:22

标签: sql-server xml tsql sql-server-2005 xml-namespaces

当我运行我的查询时,命名空间添加了根元素但是第二个元素我也有xmlns =“”...我想删除它.​​..我需要添加名称空间前缀到一些元素。

我提供了一个例子:

declare @xml_h as xml
declare @xml_d as xml

select @xml_h = (
    select NewID() as [UID]
    for XML PATH('Head')
    )

select @xml_d = (
    select NULL, 
    (
        select 'V00001' as [ID],
            'Some name' as [Name]
        for XML PATH('SubData'), TYPE
    )
    for XML PATH('Data')
    )

;with XmlNameSpaces (DEFAULT 'uri_1', 'uri_2' as t)
select @xml_h, @xml_d for XML PATH(''), ROOT('ROOT')

结果是:

<ROOT xmlns:t="uri_2" xmlns="uri_1">
    <Head xmlns="">
        <UID>B12B8836-2061-4934-AC06-67D34579D1A6</UID>
    </Head>
    <Data xmlns="">
        <SubData>
            <ID>V00001</ID>
            <Name>Some name</Name>
        </SubData>
    </Data>
</ROOT>

但我需要这个:

<ROOT xmlns:t="uri_2" xmlns="uri_1">
    <Head>
        <t:UID>B12B8836-2061-4934-AC06-67D34579D1A6</t:UID>
    </Head>
    <Data>
        <t:SubData>
            <t:ID>V00001</t:ID>
            <t:Name>Some name</t:Name>
        </t:SubData>
    </Data>
</ROOT>

有没有办法删除不必要的空白名称空间并添加名称空间前缀?

感谢

1 个答案:

答案 0 :(得分:0)

这将构建一个与您想要的XML相同的XML。

declare @xml_h as xml
declare @xml_d as xml

;with XmlNameSpaces (DEFAULT 'uri_1', 'uri_2' as t)
select @xml_h = (
    select NewID() as [t.UID]
    for XML PATH('Head')
    )

;with XmlNameSpaces (DEFAULT 'uri_1', 'uri_2' as t)
select @xml_d = (
    select NULL, 
    (
        select 'V00001' as [t.ID],
            'Some name' as [t.Name]
        for XML PATH('t.SubData'), TYPE
    )
    for XML PATH('Data')
    )

;with XmlNameSpaces (DEFAULT 'uri_1', 'uri_2' as t)
select @xml_h, @xml_d for XML PATH(''), ROOT('ROOT')
<ROOT xmlns:t="uri_2" xmlns="uri_1">
  <Head xmlns:t="uri_2" xmlns="uri_1">
    <t.UID>ABBECBF4-59BE-46DF-B42E-4325748E0079</t.UID>
  </Head>
  <Data xmlns:t="uri_2" xmlns="uri_1">
    <t.SubData xmlns:t="uri_2" xmlns="uri_1">
      <t.ID>V00001</t.ID>
      <t.Name>Some name</t.Name>
    </t.SubData>
  </Data>
</ROOT>

正如您所看到的,在子元素中重复了名称空间声明。如果您确实遇到问题,可以重写查询以使用EXPLICIT Mode,也可以将您的投票添加到this connect item,并希望它成为未来SQL Server版本的一部分。< / p>