【问题标题】:Generate XML with no default namespace in child nodes在子节点中生成没有默认命名空间的 XML
【发布时间】:2013-03-14 13:01:20
【问题描述】:

我正在尝试使用 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="" 但预期的结果是简单地获得没有定义命名空间。

【问题讨论】:

  • 问题不清楚。您得到的输出 does 在子节点中没有默认命名空间。

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


【解决方案1】:

解决它的唯一方法是更改​​:

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

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

【讨论】:

  • 这种方法的问题是需要一个没有前缀的默认命名空间。
  • 在这种情况下,没有简单的方法。
  • 实际上,有一种方法可以使用 FOR XML EXPLICIT,但是由于我使用的是一个大表,因此将所有字段都指定为元素很麻烦。
  • 这就是我所说的,没有简单的方法。 ;-)
  • 您可以使用Select Convert(Xml, Replace(Convert(Varchar(Max), @xmlData), 'xmlns:AnySuffix', 'xmlns')) 之类的东西来删除后缀...我不建议这样做。
【解决方案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')

结果:

<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>

【讨论】:

  • 我认为您只是忘记阅读问题中的这一行? “问题是标签包含空白命名空间 xmlns="" 但预期的结果是简单地获得没有定义命名空间。”
猜你喜欢
  • 2017-03-14
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
  • 1970-01-01
相关资源
最近更新 更多