2010-11-09 144 views
9

我在这里选择了标题,因为我的问题是我需要获取示例中提到的Item节点。 我有以下的XML,并且在使用LINQ查询时遇到了问题,之前我已经能够解析XML - 但是我一直坚持这个小时,并希望有人能够提供帮助。 这里是我下面的XML数据(例如数据):如何使用LINQ在XML中按名称获取元素

<a:entry xmlns:a="http://www.w3.org/2005/Atom"> 
<a:id>98765</a:id> 
<info>Data Catalogue</info> 
    <data> 
    <items> 
      <item> 
       <id>123456</id> 
       <value>Item One</value> 
      </item> 
      <item> 
       <id>654321</id> 
       <value>Item Two</value> 
      </item> 
     <items> 
    </data> 
    <items> 
     <item> 
     <id>123456</id> 
     <value>Item One</value> 
     </item> 
     <item> 
     <id>654321</id> 
     <value>Item Two</value> 
     </item> 
    <items> 
    <a:author> 
    <a:name>Catalogue</a:name> 
    </a:author> 
</a:entry> 

我希望能够从中提取下项目的项目XML标签的ID,但是有一个项目标签与项目项下的数据,我不根本想要这些节点 - 如果这表示为路径,我需要root/items/id/id。我已经尝试了我所知道的所有关于LINQ的知识,所以如果有人可以提供帮助,需要注意的事情,尽管这是基于系统的示例数据 - 格式无法更改,因此这不是一个可接受的解决方案。
我似乎无法确定我要去哪里错了 - 我尝试的每个LINQ表达式都不会返回任何内容,我认为这个命名空间是一个问题,并且试图将其整合,但我正在进行循环。
解决方案必须在Silverlight中工作和C#

我曾尝试以下:

IEnumerable<XElement> nodes = 
element.Elements().Where(e => e.Name.LocalName == "items") 

但是这让我所有的“项目”,包括下的那些“数据”我不想这些。


如果我做我的XML下面我确实看到了元素的名称显示:

XElement element = XElement.Parse(data); 
foreach (XElement node in element.Elements()) 
{ 
    MessageBox.Show(node.Name.LocalName); 
} 

但是当我这样做,我不能见项目节点名称在所有 - 我已经检查了XElement,它确实有节点,当我输出上面的名称时,“items”会与info和id一起显示!

foreach (XElement node in element.Elements("items")) 
    { 
    MessageBox.Show(node.Name.LocalName); 
    } 
+1

我想通了 - 那里是一片空白的额外命名空间声明 - 加入一个隐含的命名空间来我的XML,使用的XNamespace,这和它添加到元素名称解决问题! – RoguePlanetoid 2010-11-09 16:52:12

回答

18

假设element是你<a:entry>元素:

var ids = element.Element("items") 
       .Elements("item") 
       .Select(item => item.Element("id").Value); 

ElementElements方法返回唯一的直接孩子,不是所有的子孙,所以它不会返回<items>元素是<data>

+1

这不起作用,虽然我认为它会是我之前用过的那种thijng - 我发现我根本无法从根目录获取任何元素,但是我离开的根目录下有一个值节点在这个例子中,我也无法读取它 - 如果我查询后代有​​一些 - 只是不知道发生了什么。 – RoguePlanetoid 2010-11-09 16:27:55

+0

只要我像我自己的答案一样考虑命名空间,这是行不通的! – RoguePlanetoid 2010-11-09 16:54:28

+0

你没有在你的问题中提供这些信息......我用''元素作为根,并且它工作正常。 – 2010-11-09 17:03:44

6

我在我的XML中有一个空白的NameSpace声明我没有注意到,一旦我将它添加到我的代码它的工作 - 忘记LINQ是非常名字空间ori ented!

XNameSpace ns = "http://example.org/namespace"; 
var ids = element.Element(ns + "items") 
       .Elements("item") 
       .Select(item => item.Element("id").Value); 
+1

有同样的问题,这解决了它! – 2016-01-19 13:28:46