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

私のクエリは、現在のところ名前空間が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 'ns1:A2', 
     COLUMN3 as 'ns1:A3' 
FROM MYTABLE 
FOR XML PATH ('ns1:A'), ROOT('ns1:Message'), ELEMENTS 

このクエリは正常に動作しますが、クエリにns2またはns3名前空間を追加しようとすると、何も動作しないようです。これはどのようにしなければならないのですか? ありがとうございます!

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」が複数回になりますが、 - による名前空間に:

答えて

1
私は非常にあなたが達成しようとするものを、理解していない

...

これは動作します - それは異なる要素として扱われます。それが名前空間の主な目的です。

ほとんどの場合、デフォルトの名前空間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

関連する問題