我尝试使用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命名空间时似乎没有任何效果。如何做到这一点。 提前谢谢!
答案 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>