2015-01-16 39 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

相关问题