2017-02-27 78 views
3

我尝试使用必须包含多个名称空间的sqlserver创建XML。 XML应该看起来像这样:如何在sqlserver查询中添加多个名称空间来创建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

我不太明白,你试图达到什么......

这工作:

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 

元素名为“A1”将在那里多次,但是 - 由于命名空间 - 它被作为不同的元素处理。这是命名空间的主要目的。

在大多数情况下,有一个默认命名空间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> 
+0

感谢这为我工作。我认为我对命名空间的看法并不完全正确。小组的嵌套为我工作。 XML由其他公司设计,不知道这种设计的原因。 – Carlo

相关问题