在子节点中生成没有默认命名空间的XML

时间:2013-03-14 13:01:21

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

我正在尝试使用T-SQL生成一个XML文件,在根节点中使用默认命名空间,但在子节点中没有定义命名空间。

DECLARE @xmlData XML
DECLARE @xmlInner XML

SELECT @xmlInner =
(
SELECT * FROM dbo.GH_DATA_BS_EVLTN_MNTH_ANL [r]
FOR XML PATH('r'), TYPE
)

;WITH XMLNAMESPACES (DEFAULT 'http://www.testnamespace.com')
SELECT @xmlData = 

(
SELECT '2012-10-25T14:13:00Z' as "@DataFeedDate",@xmlInner
FOR XML PATH('root')
)

SELECT @xmlData

上面的脚本生成以下XML文件

<root xmlns="http://www.testnamespace.com" DataFeedDate="2012-10-25T14:13:00Z">
  <r xmlns="">
    <RPRT_DT_CD>2012-10-25T14:15:00-05:00</RPRT_DT_CD>
    <RPRT_MO_CD>2013-01</RPRT_MO_CD>
    <RPRT_EV_CD>1</RPRT_EV_CD>
  </r>
</root>

问题是标记包含空命名空间xmlns =“”但是预期的结果是简单地没有定义命名空间。

2 个答案:

答案 0 :(得分:0)

唯一的解决方法是改变:

;WITH XMLNAMESPACES (DEFAULT 'http://www.testnamespace.com')

;WITH XMLNAMESPACES ('http://www.testnamespace.com' as anySuffix)

答案 1 :(得分:-1)

您可以使用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')

结果:

<Parent xmlns="http://www...com/content">
  <Child xmlns="">
    <ChildElement>1</ChildElement>
  </Child>
</Parent>
<Parent xmlns="http://www...com/content">
  <Child xmlns="">
    <ChildElement>1</ChildElement>
  </Child>
</Parent>