2015-01-16 44 views
2

我正在嘗試使用Bing地圖API,它會返回一個XML文檔。該文件(簡化但保持結構)是無法使用XDocument查詢XML文檔並獲得期望的結果

<Response xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns="http://schemas.microsoft.com/search/local/ws/rest/v1"> 
    <StatusCode> 
    200 
    </StatusCode> 
    <ResourceSets> 
     <ResourceSet> 
     <Resources> 
     <TrafficIncident> 
     <Severity> 
      Minor 
     </Severity> 
     <RoadClosed> 
      false 
     </RoadClosed> 
     </TrafficIncident> 
     </Resources> 
     </ResourceSet> 
    </ResourceSets> 
</Response> 

在這種情況下,只有1個流量問題,但可能有很多。

我想如果道路被關閉提取和嚴重性

的XML存儲在xd對象(類型XDocuement

下工作正常(沒有錯誤,但返回所有元素)

var allNodes = (from x in xd.Descendants() 
       select x).ToList(); 

,但如果我添加元素的名稱則返回0項

列表

我認爲上面的代碼是說:

從XD,抓住所有的「資源」元素的後裔

如果我的理解是正確的,爲什麼它返回0結果

+0

只是爲了澄清,是'xd'的''Response'元素的根?即你沒有加載不同的元素,對吧? – Yuck

+0

此外,我目前無法測試,但試試'xd.Descendants(「// Resources」)' – Yuck

+0

嗯......正如我所說,目前無法測試。有一些方法可以讓你使用XPath來查詢文檔結構。我想不起來。 – Yuck

回答

2

您必須包括(默認)XML命名空間,如下所示:

var name = XName.Get("Resources", "http://schemas.microsoft.com/search/local/ws/rest/v1"); 
var allNodes = (from x in xd.Descendants(name) 
       select x).ToList(); 
2

您不能忘記XML命名空間。

XNamespace search = "http://schemas.microsoft.com/search/local/ws/rest/v1"; 

var allNodes = (from x in xd.Descendants(search + "Resources") 
       select x).ToList(); 
+0

你應該爲XName.Get(),看到我的答案。 – helb

+0

XNamespace類具有運算符來啓用此(希望)更好的語法。請參閱[添加](http://msdn.microsoft.com/library/system.xml.linq.xnamespace.op_addition)和[隱式](http://msdn.microsoft.com/library/system.xml.linq。 xnamespace.op_implicit)。 –

+1

我更關心可讀性。但是,再一次,這總是部分基於觀點。 – helb

相關問題