2016-07-17 64 views
0

我有下面的XML:SQL服務器:XQUERY命名空間解析

declare @xml xml = ' 
    <DiscoverResponse xmlns="urn:schemas-microsoft-com:xml-analysis"> 
     <return> 
     <root xmlns="urn:schemas-microsoft-com:xml-analysis:rowset"> 
      <row> 
      <xars:METADATA xmlns="http://schemas.microsoft.com/analysisservices/2003/engine"> 
       <Server> 
       <Name>myName</Name> 
       </Server> 
      </xars:METADATA> 
      </row> 
     </root> 
     </return> 
    </DiscoverResponse>' 

而且我已經能夠解析到<行>標籤與下面的查詢

; WITH XMLNAMESPACES(
     'urn:schemas-microsoft-com:xml-analysis'      AS ns1, 
     'urn:schemas-microsoft-com:xml-analysis:rowset'     AS ns2 
    ) 
    select 
     t.x.value('ns2:Name[1]','varchar(100)') AS Name 
    from @xml.nodes('//ns1:DiscoverResponse/ns1:return/ns2:root/ns2:row') t(x) 

我堅持試圖找出如何查詢過去的< xars:METADATA >標籤。也就是說,我一直未能成功地構造一個名稱空間聲明和路徑規範,以便到達<服務器節點(我試圖提取服務器的名稱)。我似乎正在碰到額外的冒號。

在此先感謝。

+1

你的XML是無效的(或也許是一個張貼是不完整的)。 XML變量聲明+賦值觸發的異常:*消息9459,級別16,狀態1,行1. XML解析:行6,字符93,未聲明的前綴* – har07

+0

該XML如何生成?現有的答案是相當不錯的,但是如果XML在你發佈的時候確實存在,那麼你就麻煩了......有幾個默認命名空間,名稱空間「xars」根本就沒有聲明......這是哪裏來自?這一代是否在你的控制之下?有很多方法可以查詢這個,但它會變得醜陋和緩慢...... – Shnugo

+0

唉,它是SSAS XMLA查詢的直接輸出,所以我無法控制返回的XML是否格式正確。 –

回答

0

你有一對夫婦的事情出錯:

  1. 中的XAR命名空間在XML沒有聲明。我相信xars的命名空間是「urn:schemas-microsoft-com:xml-analysis:rowset」,實際上它具有默認命名空間(根形式),但未明確映射到xars前綴。

  2. xquery缺少對名稱空間「http://schemas.microsoft.com/analysisservices/2003/engine」的引用,它在xml中設置爲默認名稱空間幷包含METADATA。

所以第一,我已經改變了你的示例XML至包括的XAR命名空間:我期待你的實際的XML有這個聲明在別處,所以你problably不需要進行此更改。

declare @xml xml = N'<DiscoverResponse xmlns="urn:schemas-microsoft-com:xml-analysis"> 
    <return> 
    <root xmlns="urn:schemas-microsoft-com:xml-analysis:rowset"> 
     <row> 
     <xars:METADATA xmlns="http://schemas.microsoft.com/analysisservices/2003/engine" xmlns:xars="urn:schemas-microsoft-com:xml-analysis:rowset"> 
      <Server> 
      <Name>myName</Name> 
      </Server> 
     </xars:METADATA> 
     </row> 
    </root> 
    </return> 
</DiscoverResponse>' 

其次,我已經添加了「http://schemas.microsoft.com/analysisservices/2003/engine」(如NS3)到您的查詢,更改查詢引用它。

; WITH XMLNAMESPACES(
    'urn:schemas-microsoft-com:xml-analysis'      AS ns1, 
    'urn:schemas-microsoft-com:xml-analysis:rowset'     AS ns2, 
    'http://schemas.microsoft.com/analysisservices/2003/engine'  AS ns3 
) 
select 
    t.x.value('ns3:Name[1]','varchar(100)') AS Name 
from @xml.nodes('//ns1:DiscoverResponse/ns1:return/ns2:root/ns2:row/ns2:METADATA/ns3:Server') t(x) 
1

1),XML是無效的。

2)如果您想要避免 XML NAMESPACES,那麼您可以對每個XML元素使用以下語法:*:XmlElement

實施例:

declare @xml xml = N'<DiscoverResponse xmlns="urn:schemas-microsoft-com:xml-analysis"> 
     <return> 
     <root xmlns="urn:schemas-microsoft-com:xml-analysis:rowset"> 
      <row> 
      <xars:METADATA xmlns="http://schemas.microsoft.com/analysisservices/2003/engine" xmlns:xars="aaa"> 
       <Server> 
       <Name>myName</Name> 
       </Server> 
      </xars:METADATA> 
      </row> 
     </root> 
     </return> 
    </DiscoverResponse>' 

SELECT x.y.value('(*:Server/*:Name/text())[1]', 'NVARCHAR(260)') AS Server_Name 
FROM @xml.nodes('*:DiscoverResponse/*:return/*:root/*:row/*:METADATA') x(y) 

結果:

Server_Name 
----------- 
myName