如何在sqlserver查询中添加多个名称空间以创建XML

时间:2017-02-27 15:35:15

标签: sql-server xml

我尝试使用sqlserver创建一个必须包含多个名称空间的XML。 XML应如下所示:

<ns1:Message xmlns:ns1="http://Something/A"
                       xmlns:ns2="http://Something/B" 
                       xmlns:ns3="http://Something/C">
    <ns1:A>
        <ns1:A1>201608111003201</ns1:A1>
        <ns1:A2>Some text</ns1:A2>
        <ns1:A3>More text</ns1:A3>
    </ns1:A>
    <ns2:B>
        <ns2:B1>123456788</ns2:B1>
        <ns2:B2>Even more text</B2>
    </ns2:B>
    <ns3:C>
        <ns3:C1>E232323</ns3:C1>
        <ns3:C2>P</ns3:C2>
    </ns3:C>
</ns1:Message

我的查询现在只有一个命名空间看起来像这样。

WITH XMLNAMESPACES ('http://Something/A' as ns3,
                   'http://Something/B' as ns2,  
                   'http://Something/C' as ns1)

SELECT COLUMN1 as 'ns1:A1',
       COLUMN2 as 'ns1:A2',
       COLUMN3 as 'ns1:A3'
FROM MYTABLE
FOR XML PATH ('ns1:A'), ROOT('ns1:Message'), ELEMENTS

此查询工作正常,但是当我尝试在查询中添加ns2或ns3命名空间时似乎没有任何效果。如何做到这一点。 提前谢谢!

1 个答案:

答案 0 :(得分:1)

我不太明白,你想要实现的目标......

这有效:

WITH XMLNAMESPACES ('http://Something/A' as ns3,
                   'http://Something/B' as ns2,  
                   'http://Something/C' as ns1)

SELECT COLUMN1 as 'ns1:A1',
       COLUMN2 as 'ns2:A1',
       COLUMN3 as 'ns3:A1'
FROM MYTABLE
FOR XML PATH ('ns1:A'), ROOT('ns1:Message'), ELEMENTS

元素名称&#34; A1&#34;会有多次,但是 - 由于名称空间 - 它被作为不同的元素处理。这是命名空间的主要目的。

在大多数情况下,存在默认命名空间xmlns="SomeURL"和子命名空间,如xmlns:sub1="SomeSubURL"。没有特定命名空间的元素属于默认命名空间,其他元素将以sub1:SomeName开头,因此属于子命名空间。但是,没有必要定义默认命名空间。

我认为您误解了名称空间的含义。您的示例不需要命名空间...您正在使用嵌套对数据进行分组......

以下代码会准确生成您想要访问的XML,但这种设计似乎过于复杂......也许您有充分理由这样做。

WITH XMLNAMESPACES ('http://Something/C' as ns1
                   ,'http://Something/A' as ns2
                   ,'http://Something/B' as ns3)

SELECT 201608111003201 AS [ns1:A/ns1:A1]
      ,'Some text' AS [ns1:A/ns1:A2]  
      ,'More text' AS [ns1:A/ns1:A3]

      ,123456788 AS [ns2:B/ns2:B1]
      ,'Even more text' AS [ns2:B/ns2:B2]

      ,'E232323' AS [ns3:C/ns3:C1]
      ,'P' AS [ns3:C/ns3:C2]
FOR XML PATH (''), ROOT('ns1:Message'), ELEMENTS

结果

<ns1:Message xmlns:ns3="http://Something/B" xmlns:ns2="http://Something/A" xmlns:ns1="http://Something/C">
  <ns1:A>
    <ns1:A1>201608111003201</ns1:A1>
    <ns1:A2>Some text</ns1:A2>
    <ns1:A3>More text</ns1:A3>
  </ns1:A>
  <ns2:B>
    <ns2:B1>123456788</ns2:B1>
    <ns2:B2>Even more text</ns2:B2>
  </ns2:B>
  <ns3:C>
    <ns3:C1>E232323</ns3:C1>
    <ns3:C2>P</ns3:C2>
  </ns3:C>
</ns1:Message>