2017-02-27 72 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

相關問題