2013-01-08 67 views
1

在具有空名稱空間的節點的XML字段上執行Xpath查詢時,我在SQL Server 2008 R2上遇到了一個奇怪的行爲。SQL Server查詢XML xpath空名稱空間

此查詢不返回結果:

[xml_field].query('/RootNode/NodeWithEmptyNamespace') 

該查詢返回的結果:

[xml_field].query('/dft:RootNode/NodeWithEmptyNamespace') 

爲了澄清這個查詢也返回結果,因此沒有前綴是強制性的根節點(也可能違約命名空間):

[xml_field].query('/RootNode') 

根據XML namespace default documation當定義空名稱空間時,名稱空間爲無。

在數據庫中的XML如下:

<RootNode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org"> 
    <otherNode>Dummy data</otherNode> 
    <NodeWithEmptyNamespace xmlns="">Other dummy data</NodeWithEmptyNamespace> 
</RootNode> 

完整的查詢:

WITH XMLNAMESPACES ('http://tempuri.org' as dft) 
SELECT TOP 150 [ID], 
     [xml_field].query('/dft:RootNode/NodeWithEmptyNamespace') 
    FROM [database]; 

沒有人有這種行爲的解釋或者這是一個錯誤?

+1

''有一個非空的XML命名空間 - 所以你必須定義和使用它 - 我不明白你的問題真的是什麼..... –

+0

我的問題不清楚,無論是/ RootNode和/ dft:RootNode返回RootNode,所以前綴不是必需的。 – user823959

回答

4

目前尚不清楚你的問題是什麼。使用已發佈的XML示例,RootNode元素和otherNode元素位於名稱空間http://tempuri.org中,而NodeWithEmptyNamespace元素不在名稱空間中(因爲xmlns=""將它放在那裏)。使用XPath路徑或步驟NodeWithEmptyNamespace在沒有命名空間中選擇該名稱的元素,並且RootNode也會在命名空間中選擇該名稱的元素,只有在您的輸入中不存在這樣的元素。因此,您的路徑/dft:RootNode/NodeWithEmptyNamespace正在做正確的事情,它在名稱空間中選擇與dft前綴(即http://tempuri.org)綁定的名稱空間中的本地名稱爲RootNode的元素,並在沒有名稱空間中使用本地名稱爲NodeWithEmptyNamespace的子元素。