【问题标题】:Default namespace with FOR XML PATHFOR XML PATH 的默认命名空间
【发布时间】:2011-10-13 08:54:15
【问题描述】:

考虑以下 SQL:

;WITH XMLNAMESPACES(DEFAULT 'http://www.mynamespace.co.uk')
,CTE_DummyData AS (
    select id=1
)
select TOP 1
    [@ID]=1,
    (select top 1 [@ID] = 1 FROM CTE_DummyData FOR XML PATH ('Child'), TYPE)
from CTE_DummyData
FOR XML PATH ('Parent')

Thie 返回 xml:

<Parent xmlns="http://www.mynamespace.co.uk" ID="1">
  <Child xmlns="http://www.mynamespace.co.uk" ID="1" />
</Parent>

我需要的是仅在根元素上返回带有 xmlns 声明的 xml。例如:

<Parent xmlns="http://www.mynamespace.co.uk" ID="1">
  <Child ID="1" />
</Parent>

有没有办法做到这一点?

注意: 上面的 SQL 是对实际代码的极端简化,它会生成一个复杂的文档,因此如果不给我几天额外的工作要做,从 FOR XML PATH 进行更改并不是一个真正的选择。要明确在整个文档的顶层需要有NS,并且所有的孩子都应该没有。

【问题讨论】:

  • 我找不到办法,但它们的意思应该是一样的——为什么不能用第一种形式?
  • @Damien:这是数据迁移过程的一部分。虽然第一个文档的含义相同(如您所说),但当我们将它传递给(第三方)导入 Web 服务时它不起作用。我认为问题在于它使用子查询。如果您使用单个查询,并使用 [Child/@ID] 定义 Child 元素,它可以正常工作,但这需要重新考虑代码(我已经继承)

标签: xml tsql for-xml-path


【解决方案1】:

您可以使用"query from hell"

;with CTE_DummyData AS (
    select id=1
)
select 1 as tag,
       0 as parent,
       'http://www.mynamespace.co.uk' as [Parent!1!xmlns],
       id as [Parent!1!ID],
       null as [Child!2!ID]
from CTE_DummyData       
union all
select top 1
       2,
       1,
       null,
       null,
       id
from CTE_DummyData       
for xml explicit

【讨论】:

  • +1 aargh - 在我的真实情况下尝试实施会很糟糕!不过这个想法很好,我有办法使用它来解决我的问题。
【解决方案2】:

您可以使用 UDF 来生成子节点。例如

ALTER FUNCTION [dbo].[udf_get_child_section] (
    @serviceHeaderId INT
 )
RETURNS XML

BEGIN

    DECLARE @result XML;

    SELECT @result = 
    (
        SELECT 1 AS 'ChildElement'
        FOR XML PATH('Child')
    )

    RETURN @result

END


GO

DECLARE @Ids TABLE
( 
    ID int 
)

INSERT INTO @Ids
SELECT 1 AS ID 
UNION ALL
SELECT 2 AS ID

;WITH XMLNAMESPACES (DEFAULT 'http://www...com/content')
SELECT 
    [dbo].[udf_get_child_section](ID)
FROM 
    @Ids
FOR XML PATH('Parent')

【讨论】:

  • 最初的事情是虽然这是一个更复杂文档的简化,所以想法是只有顶级元素显示 NS,所有子元素(所有级别)都不会有它。如果可以将您的解决方案转过来,以便 UDF 生成顶级元素,而其余的则不生成,那么您的解决方案将非常好。你认为你可以这样工作吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-19
  • 2013-06-23
  • 2020-01-29
  • 2010-10-07
相关资源
最近更新 更多